具有存储库模式的MVC脚手架 - 将子对象保存为事务

时间:2013-03-20 15:20:56

标签: asp.net-mvc entity-framework transactions repository-pattern asp.net-mvc-scaffolding

我一直在搜索论坛和存储库模式博客,以便对我应该如何编写项目进行一些明确的指导而且我被卡住了。你们的任何帮助或指导都会得到很好的解释:)

我以EF5 MVC4 Razor Code First开始我的项目,并决定使用MVCScaffolding生成我的所有控制器,视图和存储库。这是我第一个使用这些技术的项目,我刚刚被告知这就是团队现在正在做的事情(但之前的开发人员先做过模型并手工编写了他们的上下文)。

所以,一切都很好,我们编写了一堆屏幕,但我们的一个屏幕是一个复杂的屏幕,涉及许多模型/子模块(即/对象模型有FK到响应,附件,审阅者等。 ..)。用户添加一堆数据,选择一个或多个审阅者,添加0个或更多附件。然后他们点击Save!

现在我的大问题是我想将所有这些数据保存为一个事务,如果其中一个子模型(即/附件)出现故障,事务将回滚。 然而,创建MVCScaffolding存储库的方式,每个模型都有自己的DB Context实例,并且它自己的Save。控制器接受每个唯一的存储库作为加载屏幕数据的参数。另外需要注意的是,对于这个屏幕,我们使用ViewModel来加载数据,然后编写自定义映射器以映射回不同的模型以进行保存。我们可以单独保存每个部分,可能解决方案只是将TransactionScope包装在我的保存中,但我也想减少对db的调用次数,因为每个存储库保存都会进行调用。

我认为我可以将代码添加到父存储库中以获取可以在一个上下文对象中添加/编辑所有子对象的单元,但这似乎比任何东西都更糟糕,我想要正确编码。

这里的其他一个项目只是创建了一个自定义数据库上下文,并且所有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。这只是一个样本......谢谢!

1 个答案:

答案 0 :(得分:1)

只需创建一个继承自Controller的类'Master'。 然后在公共用户GetUserById(Int32 id)中写下您的所有查询 最后创建一个调用私有的函数!! DbContext的实现。

我通常会给那个函数一个SystemEvents的枚举,所以我有一个参考,如果有什么东西会失败的话会发生什么......当然你需要编写自己的通知器或模型来将你自己的错误记录到数据库中用于个人测试...

我完成了所有这些,因为我可以编写所有代码,并且发现如果你真的考虑它的话,Repository Pattern在大多数情况下都是过度的。