【发布时间】:2011-03-17 00:41:52
【问题描述】:
作为 Entity Framework 的新手,我真的很纠结如何处理这组问题。在我目前正在进行的项目中,整个站点都与 EF 模型高度集成。起初,对 EF 上下文的访问是使用依赖注入引导程序控制的。出于操作原因,我们无法使用 DI 库。我删除了它,并在需要时使用了上下文对象的各个实例的模型。我开始收到以下异常:
类型“XXX”已被多次映射。
我们得出的结论是,上下文的不同实例导致了这个问题。然后我将上下文对象抽象为单个静态实例,每个线程/页面都在访问该实例。我现在遇到了几个关于交易的例外情况之一:
不允许新事务,因为有其他线程在运行 在会话中。
交易操作无法执行,因为有 处理此事务的待处理请求。
ExecuteReader 要求命令有一个事务,当 分配给命令的连接处于挂起的本地事务中。 该命令的 Transaction 属性尚未初始化。
最后一个异常发生在加载操作上。我并没有尝试将上下文状态保存回失败的线程上的 Db。然而,还有另一个线程在执行这样的操作。
这些异常充其量只是间歇性的,但我已设法使站点进入由于事务锁定而拒绝新连接的状态。不幸的是,我找不到异常详细信息。
我想我的第一个问题是,是否应该从静态单个实例中使用 EF 模型?另外,是否可以消除对 EF 中交易的需求?我尝试使用 TransactionScope 对象但没有成功...
老实说,我被困在这里,无法理解为什么(应该是)相当简单的操作会导致这样的问题......
【问题讨论】:
-
你不能使用 IOC 引导程序太糟糕了,因为Ninject 的解决方案是将“通用”实例绑定到 请求范围,就像其他人一样建议:
kernel.Bind<IRepository<SomeModel>>().To<EfGenericRepository<SomeModel, YourDbContext>>().InRequestScope();-- 重要的部分是InRequestScope
标签: .net sql-server-2005 entity-framework