Как Entity Framework обрабатывает транзакции? - PullRequest
8 голосов
/ 25 февраля 2011

Использует ли Entity Framework транзакцию, когда вы вызываете SaveChanges в вашем контексте?Есть ли способ полностью отключить транзакции, или какой-то объект отказывается от транзакции?

AdventureWorksEntities db = new AdventureWorksEntities();

Product p1 = new Product();
// ...

Product p2 = new Product();
// set invalid data

db.Products.AddObject(p1);
db.Products.AddObject(p2);

// what happens when I call this - does it roll back everything?
// can i tell p2 not to participate in the transaction?
db.SaveChanges();

Ответы [ 2 ]

7 голосов
/ 25 февраля 2011

Да , EF4 создаст новую транзакцию, если она еще не существует. См

http://msdn.microsoft.com/en-us/library/bb896325.aspx

Когда вы вызываете SaveChanges, если текущая транзакция существует, сущность Framework использует эту транзакцию для операции с источником данных. В противном случае это создает новый транзакция для операции. Вы можете определить транзакции с помощью EntityTransaction, Transaction или TransactionScope.

Нет , нет способа освободить отдельную сущность от транзакции.

Не уверен насчет вашего третьего вопроса - о том, можете ли вы полностью отключить транзакции, но я полагаю, что не на основе приведенной выше выдержки.

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

1 голос
/ 25 февраля 2011

Относительно последнего вопроса об отключении транзакций.
Попробуйте создать TransactionScope с подавлением TransactionScopeOption , чтобы полностью отключить транзакции для блока кода.Взгляните на эту ветку для получения дополнительной информации.

...