【问题标题】:Static? Repositories MVC3, EF4.2 (Code First)静止的?存储库 MVC3、EF4.2(代码优先)
【发布时间】:2011-11-18 08:54:26
【问题描述】:

我是 MVC、EF 等的新手,所以我按照 http://www.asp.net/mvc 的 MVC3 教程设置了一个应用程序(虽然还没有完成所有操作)。

到目前为止,这是我的应用程序的“架构”

  • GenericRepository
  • PropertyRepository 为“属性”实体继承 GenericRepository
  • HomeController 有 PropertyRepository 作为成员。

例子:

public class HomeController
{
    private readonly PropertyRepository _propertyRepository 
          = new PropertyRepository(new ConfigurationDbContext());
}

现在让我们考虑以下内容:

我的GenericRepository 中有一个方法需要相当长的时间,需要在一个事务中调用 6 个查询以保持完整性。我的谷歌结果 yeldet SaveChanges() 被视为一个事务 - 所以如果我对我的上下文进行多项更改然后调用 SaveChanges() 我可以“确定”这些更改在 SQL Server 上是“原子的” .对?错了吗?

此外,还有一个调用_propertyRepository.InvokeLongAndComplex() 方法的操作方法。 我刚刚发现:MVC 为每个请求创建一个新控制器。所以我最终得到了多个PropertyRepositories,这会破坏我的数据库完整性。 (我必须在数据库中维护一个我的属性的链接列表,如果用户移动一个属性,它需要 6 个步骤来相应地更改列表,但这样我可以避免在拥有数千个实体时循环遍历所有实体......)

我想将我的GenericRepository 和PropertyRepository 设为静态,因此每个HomeController 都使用相同的存储库并同步InvokeLongAndComplex 方法以确保一次只有一个线程对数据库进行更改.

我怀疑这个想法不是一个好的解决方案,但我找不到适合这个问题的解决方案 - 有些人说拥有静态存储库是可以的(但是上下文会发生什么?)。其他一些人说使用 IOC/DI(?),这听起来需要做很多工作(甚至不确定这是否能解决我的问题......)但似乎我可以“告诉”容器始终“注入” " 相同的上下文对象,相同的存储库,然后同步 InvokeLongAndComplex() 方法就足够了,不会让多个线程破坏完整性。

Why aren't data repositories static? 答案2:

2) 您通常希望每个请求拥有 1 个存储库实例,以便更轻松地确保来自一个用户的未提交更改不会对另一个用户造成混乱。

为什么每个请求都有一个存储库实例不会再次弄乱我的链接列表?

谁能给我一个建议或分享我可以遵循的最佳实践?

【问题讨论】:

    标签: asp.net-mvc-3 architecture entity-framework-4.1 software-design


    【解决方案1】:

    不!您must have a new context for each request 所以即使您将存储库设为静态,您也必须将当前上下文实例传递给每个方法,而不是在存储库中维护单个上下文。

    首先,您所说的诚信是什么意思?您是否在处理事务、并发问题或引用约束?处理所有这些问题是您的责任。 EF 会为此提供一些基本的基础架构,但最终的解决方案仍取决于您的实施。

    【讨论】:

    • 我在 HomeController 构造函数中创建了一个新的上下文。所以我每个请求都会有一个新的。但是我需要为我的所有存储库使用相同的实例吗?完整性是指数据库中的链接列表,因此在操作(添加/删除/移动)实体时,我需要确保没有 2 个线程正在操作列表。
    • 我的实体/表在此 SO-post 中看起来像:stackoverflow.com/questions/675117/…。我试图用这个问题来解释我的问题:如果两个用户正在更改 ID 为 4 的节点(User1 为头部,User2 为尾部),我的列表“混乱”意味着我无法检索节点,因为有相同 ID 的父母。好的,当我在一个请求中为所有存储库使用相同的上下文时,一切都应该没问题。我的问题是,当我在移动操作期间生成第二个请求时,我收到一个错误,即序列中没有元素。
    • 一个上下文不会帮助你。这将导致同样的问题,因为多个线程将更改单个实体,并且一旦任何线程调用 SaveChagnes,它也会保存来自其他线程的不完整更改。您正在寻找concurrency handling。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多