Asp.net mvc 3 静止的存储库MVC3,EF4.2(代码优先)

Asp.net mvc 3 静止的存储库MVC3,EF4.2(代码优先),asp.net-mvc-3,architecture,entity-framework-4.1,software-design,Asp.net Mvc 3,Architecture,Entity Framework 4.1,Software Design,我是MVC、EF之类的新手,所以我在上学习了MVC3教程,并设置了一个应用程序(虽然还没有完成所有工作) 这是我的应用程序到目前为止的“架构” genericlepository PropertyRepository继承“Property”实体的GenericRepository HomeController,其成员为PropertyRepository 例如: public class HomeController { private readonly PropertyReposi

我是MVC、EF之类的新手,所以我在上学习了MVC3教程,并设置了一个应用程序(虽然还没有完成所有工作)

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

  • genericlepository
  • PropertyRepository
    继承“Property”实体的
    GenericRepository
  • HomeController
    ,其成员为
    PropertyRepository
例如:

public class HomeController
{
    private readonly PropertyRepository _propertyRepository 
          = new PropertyRepository(new ConfigurationDbContext());
}
现在让我们考虑以下问题:

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

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

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

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

答复2:

2) 您通常希望每个请求有一个存储库实例,以便更容易地确保来自一个用户的未限制更改不会给另一个用户带来麻烦

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

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

不!因此,即使将存储库设置为静态,也必须将当前上下文实例传递给每个its方法,而不是在存储库中维护单个上下文


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

我在HomeController构造函数中创建了一个新的上下文。所以每个请求我都会有一个新的。但是我的所有存储库都需要使用相同的实例?完整性指的是数据库中的链接列表,因此,在操作(添加/删除/移动)实体时,我需要确保没有两个线程在操作该列表。我的实体/表如下所示,因此本文:。我试图用这个问题来解释我的问题:如果两个用户正在更改ID为4的节点(User1改为head,User2改为tail),我的列表“混乱”意味着我无法检索节点,因为有具有相同ID的父节点。好的,当我在一个请求中对所有存储库使用相同的上下文时,一切都应该正常。我的问题是,当我在移动操作期间生成第二个请求时,我得到一个错误,即序列中没有元素。一个上下文对您没有帮助。这将导致相同的问题,因为多个线程将更改单个实体,并且一旦任何线程调用SaveChagnes,它也将保存来自其他线程的不完整更改。你在找我。