我一直在搜索论坛和存储库模式博客,了解我应该如何编码我的项目,并坚持下来。任何从你们的帮助或指导将非常认真:)MVC脚手架与存储库模式 - 将儿童物品保存为交易
我开始我的项目作为EF5 MVC4 Razor Code First,并决定使用MVCScaffolding来生成我所有的控制器,视图和存储库。这是我使用这些技术的第一个项目,我刚才被告知这就是团队现在这样做的过程(但之前的开发人员确实先建模并手动编写了他们的上下文)。我们正在编码一堆屏幕,但我们的一个屏幕是一个复杂的屏幕,涉及许多模型/子模块(即/对象模型具有FK到响应,附件,审阅者等等)。 ...)。用户添加一堆数据,选择一个或多个评论者,添加0个或更多附件。然后他们击中保存!
现在我的大问题是,我想将所有这些数据保存为一个事务,并且如果某个子模型(即/附件)失败,事务将回滚。 然而,,创建MVCScaffolding存储库的方式,每个模型都有它自己的DB上下文实例,并且它是自己的Save。控制器接受每个唯一的存储库作为加载屏幕数据的参数。另外需要注意的是,在此屏幕中,我们使用ViewModel加载数据,然后编写自定义映射器以映射回不同模型进行保存。我们可以分别保存每一部分,可能解决方案只是将我的保存包装到TransactionScope中,但我也想减少对数据库的调用次数,因为每个存储库都会保存一个调用。
我以为我可以将代码添加到父存储库的UnitOfWork类型保存,它可以在一个上下文对象中添加/编辑所有子对象,但这看起来像是比任何东西都更加黑客,并且我想要正确编写代码。
这里的其他项目之一只是做了一个自定义的数据库上下文,所有的Save方法都在这个类中,这是做到这一点的最好方法吗?另一个开发人员首先编码,但手工编码所有的Save方法。他们都没有在一个标准的地方,他在内部使用DBContext的TransactionScope(是过度杀伤或DBContext不处理交易)?
因为我对此很陌生,所以我需要帮助,没有人和我一起工作似乎同意采用适当的方法。我不确定我的模型对于“MVC应用程序”是否是错误的,因为我是一个数据库沉重的思考者。
下面是我的模型样本,任何指导表示赞赏。谢谢:)
public class Anomaly
{
[Key]
public int AnomalyId { get; set; }
public string Subject { get; set; }
public int PlantId { get; set; }
[ForeignKey("PlantId")]
public virtual Plant Plant { get; set; }
public DateTime? ReviewByDate { get; set; }
public virtual ICollection<AnomalyReviewer> AnomolyReviewers { get; set; }
public virtual ICollection<AnomalyAttachment> AnomalyAttachments { get; set; }
}
public class AnomalyAttachment
{
[Key]
public int AnomalyAttachmentId { get; set; }
public int AnomalyId { get; set; }
[ForeignKey("AnomalyId")]
public virtual Anomaly Anomaly { get; set; }
public string FilePath { get; set; }
public string FileName { get; set; }
public string FileExtension { get; set; }
public string Notes { get; set; }
}
ps。这只是一个示例...谢谢!