您好我正在使用 Entity Framework 4.1 代码优先方法。我有MyContainer
继承的类DBContext
。
我有一个流程,每个步骤有 7 个步骤访问许多存储库方法(大约 60 个)。此流程自动或手动执行取决于业务逻辑和用户要求。现在为了自动进程的性能观点,我创建了上下文,即MyContainer
一次对象并将其传递给所有方法,并在进程结束时处理它,它的工作正常并提高了性能。但是当这个进程手动执行时,执行相同的方法并且容器是在方法本身中创建和处置的。例如下面,但这只是粗略的代码。
public bool UpdateProcess(Process process, MyContainer container = null)
{
bool disposeContainer = false;
if (container == null)
{
container = new MyContainer();
disposeContainer = true;
}
var result = SaveProcess(container, process);
container.SaveChanges();
if (disposeContainer)
container.Dispose();
return result;
}
对于自动流程,事务在流程开始时创建并在流程结束时结束,手动事务在根据用户在 ui 上的操作调用的方法中的 bll 处创建。现在假设我的自动流程正在运行同时用户在 ui 上做了一些操作我得到了异常"Transaction (Process ID 65)
被锁定资源与另一个进程并已被选择“当从手动和自动过程一起调用 UpdateProcess() 方法时,我在 container.SaveChanges() 上得到它.
任何帮助将不胜感激。
如果我在这个存储库方法中创建一个事务范围,比如
public bool UpdateProcess(Process process, MyContainer container = null)
{ bool disposeContainer = false;
if (container == null)
{
container = new MyContainer();
disposeContainer = true;
}
using(var trans=new TransactionScop(TransactionScopeOption.RequiresNew))
{
var result = SaveProcess(container, process);
container.SaveChanges();
trans.Complete();
}
if (disposeContainer)
container.Dispose();
return result;
}
它工作正常。但是我不想在存储库中创建事务,因为事务已经在 bll 中进行。
任何帮助都会得到帮助。