Показаны сообщения с ярлыком Entity Framework. Показать все сообщения
Показаны сообщения с ярлыком Entity Framework. Показать все сообщения

четверг, 6 ноября 2014 г.

Что такое EntityValidationErrors и как с ним бороться.

При использовании Entity Framework вы можете столкнуться с ошибкой, гласящей "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details." Причина появления этой ошибки в большинстве случаев - банальна, либо вы забыли какие ограничения существуют на полях в вашей базе данных, либо, если БД в вашей компании занимается отдельный человек, то он вам забыл о чем-то сообщить. ;)


EntityValidationErrors - это коллекция объектов DbEntityValidationResult, каждый из которых содержит информацию об ошибках одной EF-сущности в виде объектов DbValidationError.
На самом деле, ничего страшного в этой ошибке нет, и можно легко узнать в чем конкретно у нас ошибка в коде. Все, что для этого необходимо - это обернуться вызов метода SaveChanges() вот в такой блок try-catch:


вторник, 7 октября 2014 г.

Как очистить таблицу с помощью Entity Framework.

Если вы используете в своем проекте Entity Framework и хотите удалить все содержимое какой-либо таблицы не используя другие подключения к БД, кроме существующего, то можете использовать один из двух вариантов.

Вариант первый. "Правильный" с точки зрения EF, так как при этом отслеживается состояние объектов. По этой же причине - более медленный.

 
           context.YourTable.RemoveRange(context.YourTable);
           context.SaveChanges();

И второй способ. Менее "правильный", но зато быстрый. Если вам нужно очистить таблицу с какими-то временными, не имеющими отношений с другими объектами, то этот способ - самое оно.

           context.Database.ExecuteSqlCommand("TRUNCATE TABLE [YourTable]");


вторник, 29 апреля 2014 г.

Entity Framework и транзакции

При использовании баз данных в проектах чуть более сложных, нежели простенький сайт на пару страниц, рано или поздно встает проблема использования транзакций. Если же вы решили использовать Entity Framework, то, до выхода EF6 стандартного механизма управления транзакциями в Entity Framework не существовало.  Теперь же, у свойства контекста Database появился метод BeginTransaction(). Используется от вот так.

using (var context = new YourDBContext())
{
   using (var tran = context.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
   {
     try 
     {
           /..../
           tran.Commit();
     }     
     catch
     {
           tran.Rollback();
     }        
   }
}

Есть вариант BeginTransaction() и без явного указания уровня изоляции, при использовании которого используется уровень изоляции по умолчанию для источника данных. Соответственно, все что находится в блоке using включается в транзакцию. Причем, включаться то оно, включается, но вот откатывать или коммитить транзакцию - это ваша обязанность. Автоматически при выходе из using ничего не происходит.

Ну а если вы используете предыдущие версии Entity Framework, то можно использовать делать так: подключаете сборку System.Transactions и используете класс TransactionScope.

using (var scope = new TransactionScope(TransactionScopeOptions.Requires, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
   {
      try
      {
          /..../
          scope.Complete();
      }
      catch
      {

      }
   }


В этом случае, при выходе из using транзакция автоматически откатывается. И, кстати, TransactionScope поддерживает распределенные транзакции, для чего, правда, нужно настраивать на всех машинах где исполняется код или находятся базы данных Distributed Transaction Coordinator.