0

我一直在搜索论坛和存储库模式博客,了解我应该如何编码我的项目,并坚持下来。任何从你们的帮助或指导将非常认真:)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。这只是一个示例...谢谢!

回答

1

只需创建一个继承自Controller的类“主”。 然后在公共用户GetUserById(Int32 id) 中写入所有查询。最后创建一个函数,该函数可以调用私有方法! DbContext的实现。

我通常会给这个函数一个SystemEvents的枚举,所以如果有什么东西会失败,我会得到最新发生的参考......当然,您需要编写自己的notificator或model来记录自己的错误数据库的个人测试...

我做了这一切,因为我可以写我所有的代码,发现大部分时间,如果你真的想到它的存储库模式矫枉过正。