实体框架6 usetransaction databasefirst抛出UnintentionalCodeFirstException

时间:2014-07-07 07:54:16

标签: entity-framework transactions ef-database-first

我试图执行以下操作:

  SqlConnection cnSql = new SqlConnection(cnstring);
        cnSql.Open();
        SqlTransaction Transactie = default(SqlTransaction);
        Transactie = cnSql.BeginTransaction();
        SqlCommand cmddelbonh = new SqlCommand();
        cmddelbonh.Connection = Transactie.Connection;
        cmddelbonh.Transaction = Transactie;
        cmddelbonh.CommandText = "update artikelgroepen set OMSN='XXXXX' where ID = 3";
        cmddelbonh.ExecuteNonQuery();


        using (CXNACC_TESTFIRMA cxn = new CXNACC_TESTFIRMA(cnSql))
        {
            cxn.Database.UseTransaction(Transactie);
            var myList = cxn.ARTIKELS.Take(100).ToList();
            cxn.ARTIKELS.First().OMSN = "XXXXX";
            cxn.SaveChanges();
        }

        Transactie.Commit();

这一行     cxn.Database.UseTransaction(Transactie); 进入Context上的OnModelCreating并抛出一个UnintentionalCodeFirstException

当注释掉抛出新的UnintentionalCodeFirstException时 它有效,但我不想评论出一个不应该被触发的错误。

我用Google搜索,但没有找到关于如何在数据库第一个上下文中使用EF6的UseTransaction功能的答案。

在您提出之前:app.config中存在Entity的connectionString。

对此有何想法?

由于

1 个答案:

答案 0 :(得分:1)

我发现这个article更多地解释了数据库优先与代码优先......

似乎使用构造函数将连接作为参数(您的行:using (CXNACC_TESTFIRMA cxn = new CXNACC_TESTFIRMA(cnSql)))将使用代码优先策略来构建上下文

但后来我被告知以下内容:

  

要让EF使用您的EDMX文件中的元数据,您需要传入   EntityConnection而不是直接的SqlConnection。

     

如果您希望SqlConnection能够用于其他任务   在上下文之外,您始终可以创建EntityConnection   然后从中取出StoreConnection:

  var entityConnection = new EntityConnection("name=AdventureWorksEntities");
  var dbConnection = entityConnection.StoreConnection; 
  

因为EntityConnection派生自DbConnection,您仍然可以传递   它在您尝试使用的DbContext上的相同构造函数中。