繁体   English   中英

使用EF在不同上下文之间进行交易

[英]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), ...}

一些要点:

  • 通用,已经实现了一些CRUD方法来处理此edmx的表
  • MyApp,具有我的数据库,该数据库具有多个表,并且内部具有通用表。
  • 所有数据库使用相同的connectionString,但使用不同的DbContext。
  • 通用的建议是重用表和其他项目中的此CRUD。

在我的方法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;
    }
}

有什么解决方案可以解决我的问题吗?

所有上下文以ctx.saveChanges()结尾,但是在第二个上下文中,我面临与锁表/注册人相关的异常(mysql超时)。 我了解此新注册表未提交,因此在第二个ctx中,此注册表不存在。

  1. 我们无法在环境中重现问题。 与我们联系 ,我们会将根据您的描述创建的测试项目(有效)发送到您的电子邮件中。

  2. 指定带有所有内部异常的错误的完整堆栈跟踪。

  3. 使用dbMonitor跟踪数据库活动。 这应该有助于定位您遇到的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM