Ошибка удаления объекта Entity Framework — параллелизм (как отключить параллелизм)?

#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.