Код Entity Framework
и EntityFramework core
имеют открытый исходный код. Вы можете проверить код на
- Entity Framework - Ссылка
- Ядро Entity Framework - Ссылка
Если вы видите внутренний код Метод сохранения (вставил снимок кода ниже), то вы можете проверить, что он внутренне создает транзакцию, если внешняя транзакция не указана.
internal int SaveChangesInternal(SaveOptions options, bool executeInExistingTransaction)
{
AsyncMonitor.EnsureNotEntered();
PrepareToSaveChanges(options);
var entriesAffected = 0;
// if there are no changes to save, perform fast exit to avoid interacting with or starting of new transactions
if (ObjectStateManager.HasChanges())
{
if (executeInExistingTransaction)
{
entriesAffected = SaveChangesToStore(options, null, startLocalTransaction: false);
}
else
{
var executionStrategy = DbProviderServices.GetExecutionStrategy(Connection, MetadataWorkspace);
entriesAffected = executionStrategy.Execute(
() => SaveChangesToStore(options, executionStrategy, startLocalTransaction: true));
}
}
ObjectStateManager.AssertAllForeignKeyIndexEntriesAreValid();
return entriesAffected;
}
Таким образом, приведенный ниже код будет внутренне обернут внутри транзакции, которую вы можете проверить в SQL Profiler.
using(var context = new Context())
{
var entity = context.Entities.First();
entity.A = "TST";
entity.B = "WrongValue";
context.SaveChanges();
}
Однако профилировщик SQL не запускает запись транзакций, поэтому вам необходимо настроить это в параметрах трассировки. Посмотрите на скриншот ниже для новой настройки трассировки в SQL profiler, здесь я проверил Show All events
. После этого отображается категория Transaction
. Вы можете подписаться на события Begin Tran
, Commit Tran
и Rollback Tran
для проверки выписок по транзакциям. Когда вы запустите свой сценарий, вы увидите, что Begin и Rollback должны быть зарегистрированы. 