#asp.net #linq #entity-framework
#asp.net #linq #entity-framework
Вопрос:
Есть ли способ отключить ошибку параллелизма, возникающую в EntityFramework?
Например:
using (xEntities5 entities = new xEntities5())
{
entities.Domains.MergeOption = System.Data.Objects.MergeOption.NoTracking;
Domain domain = new Domain() { DomainId = id };
EntityKey key = entities.CreateEntityKey(entities.CreateObjectSet<Domain>().EntitySet.Name, domain);
domain.EntityKey = key;
entities.Attach(domain);
//entities.AttachTo(entities.CreateObjectSet<Domain>().EntitySet.Name, domain);
entities.DeleteObject(domain);
return entities.SaveChanges(); // returns affected rows... must catch error?
}
Есть ли способ не выполнять try / catch вокруг SaveChanges, чтобы определить, не было ли ничего удалено?
Ответ №1:
Насколько я знаю, вы не можете отключить ошибку параллелизма. Ошибка параллелизма основана на количестве затронутых строк, поэтому, если вы хотите удалить строку, а она не удаляется (например, потому, что она больше не существует), запускается исключение параллелизма. Более того, SaveChanges
работает в транзакции, поэтому, если вы хотите удалить 5 строк, а удаляются только 4 строки, запускается исключение, и все удаления откатываются.
Проверка параллелизма может быть еще более строгой, если вы используете столбцы, помеченные как ConcurrencyMode.Fixed
. Эти столбцы используются в where condition инструкций SQL, поэтому могут обрабатываться только неизмененные записи базы данных.
Как только вы получите исключение параллелизма, вы должны решить его.
Ответ №2:
SaveChanges () будет генерировать исключения и не будет перехватывать их внутренне, поэтому, если вы хотите продолжить выполнение, вы должны использовать try / catch. SaveChanges() также возвращает метод с количеством объектов, переданных в базу данных, то есть, если ошибки не произошло 🙂
HTH.