Entity framework 6 usetransaction databasefirst выдает исключение UnintentionalCodeFirstException

Я пытаюсь выполнить следующее:

  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); входит в OnModelCreating в контексте и выдает UnintentionalCodeFirstException

При комментировании throw new UnintentionalCodeFirstException это работает, но мне не нравится комментировать ошибку, которая в любом случае не должна вызываться.

Я погуглил, но не нашел ответов о том, как использовать функцию UseTransaction EF6 в контексте базы данных.

Прежде чем вы спросите: connectionString для Entity присутствует в app.config.

Любые мысли по этому поводу, пожалуйста?

Спасибо


person ChrisO.    schedule 07.07.2014    source источник
comment
Я тоже ищу ответ на это.   -  person Learner    schedule 08.07.2014
comment
Я нашел эту статью, которая объясняет немного больше о базе данных в первую очередь против кода в первую очередь... Кажется, что использование конструктора, принимающего соединение в качестве параметра (ваша строка: using (CXNACC_TESTFIRMA cxn = new CXNACC_TESTFIRMA(cnSql)) ), будет использовать стратегию "сначала код" для построения контекста. Я также хотел бы найти способ использовать функцию UseTransaction EF6 с базой данных в первую очередь, потому что до сих пор мне это не удалось, но я боюсь, что это даже невозможно.   -  person Learner    schedule 08.07.2014


Ответы (1)


Я нашел эту статью, в которой объясняется еще немного о базе данных в первую очередь против кода в первую очередь...

Кажется, что использование конструктора, принимающего соединение в качестве параметра (ваша строка: 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, который вы пытались использовать.

person Learner    schedule 08.07.2014