使用EF

时间:2017-07-04 09:00:04

标签: c# mysql entity-framework transactionscope devart

我有一个项目,我希望创建一个与db相关的概念分离,并重用建议。 我使用EF,与mysql(devart)连接器,我想创建一个事务,在一些表中创建一个注册表并将此注册表链接到其他表(如果发生其他事情则回滚)

我将提供一个虚拟场景来解释这个过程:

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

一些关键点:

  • Generic,已经有一些实现了一些CRUD方法来处理这个edmx的表
  • MyApp,我的数据库,有多个表,并且里面有通用表。
  • 所有数据库使用相同的connectionString,但使用不同的DbContext。
  • 泛型的提议,是在其他项目中重用表和这个CRUD。

在我的方法createSchedule中,我需要创建一个人并将此人链接到计划。 我有一个方法已经创建了createPerson(...),它返回此Id。 我需要使用此Id链接到新的计划注册表,所以我想要这个事务操作,所以我创建一个事务范围,有两个上下文,第一个创建人,第二个创建计划。所有上下文都以ctx.saveChanges()结尾,但在第二个上下文中,我面临与锁表/注册表人员相关的异常(mysql超时)。 我知道这个新注册表尚未提交,因此,在第二个ctx中,此注册表不存在。

我已经尝试过Isolation Level = 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;
    }
}

解决我问题的任何解决方案?

1 个答案:

答案 0 :(得分:0)

  

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

  1. 我们无法在我们的环境中重现这个问题。请contact us我们会根据您的说明向您的电子邮件发送一个测试项目(有效)。

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

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