0

我一直在搜索论坛和存储库模式博客,以获得关于我应该如何编码我的项目的明确方向,但我被困住了。你们的任何帮助或指导都会非常感激:)

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

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

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

我以为我可以将代码添加到 UnitsOfWork 类型保存的父存储库中,这将在一个上下文对象中添加/编辑所有子对象,但这似乎比什么都重要,我想正确编码。

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

}

附言。这只是一个样本......谢谢!

4

1 回答 1

1

只需创建一个从 Controller 继承的“Master”类。然后在 public User GetUserById(Int32 id) 中写下你所有的查询最后创建一个调用私有的函数!DbContext 的实现。

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

我做了这一切,因为我可以编写我所有的代码,并且发现如果你真的考虑它,存储库模式在大多数情况下都是矫枉过正的。

于 2013-04-09T09:07:01.737 回答