[英]Transaction between different contexts using EF
我有一个项目,我想创建一个与db相关的概念分离,并建议重用。 我使用带有mysql(devart)连接器的EF,并且我想创建一个事务,该事务在某个表中创建注册表并将该注册表链接到其他表(如果发生其他情况,则回滚)
我将提供一个虚拟场景,以解释该过程:
Generic.edmx:
Person {Id, Name, Address, ...}
MyApp.edmx (contains my app database, who uses Generic tables)
Person {Id, Name, Address, ...}
Schedule{ScheduleId, Date, PersonId(FK), ...}
一些要点:
在我的方法createSchedule中,我需要创建一个人并将该人链接到时间表。 我已经创建了createPerson(...)方法,该方法返回此ID。 我需要使用此ID链接到新的时间表注册表,因此我需要此事务操作,因此我创建了一个具有两个上下文的事务范围,第一个上下文创建人员,第二个上下文创建时间表。 所有上下文以ctx.saveChanges()结尾,但是在第二个上下文中,我面临与锁表/注册人相关的异常(mysql超时)。 我了解此新注册表未提交,因此在第二个ctx中,此注册表不存在。
我已经尝试过隔离级别= ReadUncommited。
public static int createSchedule(...){
using (TransactionScope transaction = new TransactionScope(
TransactionScopeOption.RequiresNew,
new TransactionOptions() {
I solationLevel = IsolationLevel.ReadUncommitted }))
{
var myId = createPerson(...);
using (var ctx = new MyAppDbEntity(MyConnStr))
{
Schedule sc = new Schedule{
Id = 1,
...
PersonId = myId,
...
};
//Logic code
ctx.Schedule.Add(sc);
ctx.saveChanges(); //Exception raised Here
transaction.Complete();
}
}
}
public static int createPerson(...){
using (var ctx = new GenericDbEntity(MyConnStr))
{
Person p = new Person{
Id = 10,
...
};
//Logic code
ctx.Person.Add(p);
ctx.saveChanges();
return p.Id;
}
}
有什么解决方案可以解决我的问题吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.