我是MVC,EF之类的新手,所以我在http://www.asp.net/mvc跟踪了MVC3教程,并设置了一个应用程序(虽然尚未完成所有内容)。
到目前为止,这是我的应用程序的“架构”
GenericRepository
PropertyRepository
为“Property”实体继承GenericRepository
HomeController
其成员PropertyRepository
。 示例:
public class HomeController
{
private readonly PropertyRepository _propertyRepository
= new PropertyRepository(new ConfigurationDbContext());
}
现在让我们考虑以下内容:
我的GenericRepository
中有一个方法需要花费很长时间,需要在一个事务中调用6个查询才能保持完整性。我的google结果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)您经常希望每个请求拥有一个存储库实例,以便更轻松地确保来自一个用户的未经修改的更改不会让另一个用户陷入困境。
为什么每个请求的存储库实例不会再次弄乱我的链表?
任何人都可以给我一个建议或分享我可以遵循的最佳实践吗?
答案 0 :(得分:1)
没有!您must have a new context for each request所以,即使您将存储库设置为静态,您也必须将当前上下文实例传递给其每个方法,而不是在存储库中维护单个上下文。
首先,您的诚信是什么意思?您是在处理事务,并发问题还是引用约束?处理所有这些问题是您的责任。 EF将为此提供一些基本的基础设施,但最终的解决方案仍由您实施。