Сбой вставки структуры объекта
Использование расширений EF6 + EF для массового удаления.
В коде я делаю 2 вещи: сначала очистите все связанные объекты, а затем добавьте новые связанные объекты. Просто чтобы не проверять сходство.
Это основные объекты класса:
[Table("distrule")]
public class Distrule: CommonEntity
{
//other properties
public virtual ICollection<Distrule_content> DistruleContent { get; set; }
}
[Table("distrule_content")]
public class Distrule_content
{
[Key,Column(Order=0)]
public int distrule_id { get; set; }
[Key, Column(Order = 1)]
public string IDEC { get; set; }
[ForeignKey("distrule_id")]
public virtual Distrule Distrule { get; set; }
[ForeignKey("IDEC")]
public virtual Content Content { get; set; }
}
Вот код удаления-1:
Db.Distrule_contents.Where(x=> x.distrule_id == DistruleId).Delete();
Db.SaveChanges();
Это код удаления-2:
List<Distrule_content> dcs = Distrule.DistruleContent.ToList();
dcs.Select(x => { Db.Entry(x).State = System.Data.Entity.EntityState.Deleted; return x; }).ToList();
Db.SaveChanges();
И после некоторых манипуляций добавьте новые записи:
//dc has type of List<Distrule_content> and contain new collection.
Db.Distrule_contents.AddRange(dc);
Db.SaveChanges();
Поэтому, когда я использую delete-1, чтобы сделать это быстрее (в некоторых случаях есть до 10K записей для удаления), я получаю эту ошибку:
System.InvalidOperationException: изменения в базе данных были успешно приняты, но при обновлении контекста объекта произошла ошибка. ObjectContext может быть в несовместимом состоянии. Внутреннее сообщение об исключении: сбой при сохранении или принятии изменений, так как несколько сущностей типа 'IDS.DAL.Entities.Distrule_content' имеют одинаковое значение первичного ключа. Убедитесь, что явно установленные значения первичного ключа являются уникальными. Убедитесь, что сгенерированные базой данных первичные ключи правильно настроены в базе данных и в модели Entity Framework. Используйте Entity Designer для конфигурации базы данных сначала / модели первой. Используйте свободный API HasDatabaseGeneratedOption или DatabaseGeneratedAttribute
Когда я использую delete-2, все в порядке, только дольше.
Все операции с контекстом БД работают в области транзакций следующим образом:
new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TransactionManager.MaximumTimeout });
Контекст БД выглядит так:
public class DBWrapper : DbContext
{
public DBWrapper()
: base("Name=DefaultConnection")
{
var adapter = (IObjectContextAdapter)this;
var objectContext = adapter.ObjectContext;
objectContext.CommandTimeout = 30; // value in seconds
// set this for faster delete/insert operations
// reduce wait time from minute or two to 10-15 seconds
this.Configuration.AutoDetectChangesEnabled = false;
this.Configuration.ValidateOnSaveEnabled = false;
}
// dbsets...
}
как избежать этого исключения, так как я хочу использовать это расширение для EF?
0 ответов
В Delete
метод - немедленная операция.
Когда вы звоните, вам не нужно звонить после SaveChanges
и поэтому вы не получите эту ошибку.
В настоящее время неясно, какую библиотеку вы используете (вы говорите "Расширения EF для массового удаления." В вопросе, но изначально отметили "entity-framework-extended".
Отказ от ответственности: я являюсь владельцем всех этих продуктов.
EF Extended больше не поддерживается с 2014 года,
Рекомендуется переехать в:
- https://entityframework-plus.net/ (бесплатно и с открытым исходным кодом)
- Расширения Entity Framework (коммерческие, но
Delete
из функции запроса бесплатно)
Оба этих продукта также имеют эту функцию.