ObjectContext.AcceptAllChanges! Кто принимает и кто вносит изменения? - PullRequest
2 голосов
/ 13 апреля 2011

Я смущен Entity Framework ObjectContext.AcceptAllChanges. Вопрос в том, кто принимает и кто вносит изменения?

В общем, как управлять транзакциями и изоляцией транзакций в Entity Framework?

Я новый пользователь, поэтому я могу редактировать только свой вопрос .......

Спасибо, ребята ... Акрам Шахда и Ладислав Мрнка

Теперь мое впечатление от EF уже не очень плохое, хотя оно не добавляет функциональности по сравнению со старыми добрыми временами в доступе к базе данных в стиле «Соединение, Транзакция, ADO.Net, Хранимая процедура», за исключением возможного добавления некоторых потенциальные проблемы с безопасностью и добавление административных работ к администраторам баз данных (поскольку строка подключения должна иметь разрешение для всех таблиц) и ограничение использования некоторых методов повышения производительности, особенно во время некоторых операций пакетной базы данных.

Я рад, что все еще могу сохранить тот же уровень контроля над транзакциями и уровень изоляции транзакций с помощью «Enlist» (еще одно новое слово Microsoft, почему они просто не используют «использовать»), управляющего моим собственным соединением и «TransactionScope» «где я могу выбрать желаемый уровень изоляции.

Теперь мой вопрос об "ObjectContext.AcceptAllChanges":

  1. Кто вносит изменения?
  2. Кто принимает изменения?

Спасибо ......

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

По умолчанию AcceptAllChanges вызывается во время SaveChanges.Если сохранение прошло успешно, изменения принимаются.Вы можете отключить это и принять изменения вручную, позвонив по номеру AcceptAllChanges.Это может быть полезно в некоторых более сложных сценариях.Одним из таких сценариев может быть сложная транзакция, в которой обрабатываются несколько транзакционных ресурсов.

Например, давайте предположим, что я хочу сохранить данные в базу данных и отправить сообщение в MSMQ в той же распределенной транзакции:

using (var scope = new TransactionScope())
{
    // This version will not accept changes automatically
    context.SaveChanges(SaveOptions.DetectChangesBeforeSave);

    // Let's assume this sends message to the message queue
    myMessageSender.SendSomeMessage(...);

    scope.Complete();

    // Now I know that transaction is completed and I can accept
    // changes in the context
    context.AcceptAllChanges();
}

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

0 голосов
/ 13 апреля 2011

Для управления транзакциями в структуре объекта вы можете обратиться по следующей ссылке:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...