Я использую EF6 с шаблоном Generic Repository. Недавно у меня возникла проблема с попыткой удалить составной объект за один раз. Вот упрощенный вариант:EF с нетерпением Загрузка свойств навигационных свойств
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
[ForeignKey("Parent")]
public int ParentId { get; set; }
public virtual Parent Parent { get; set; }
}
Для удаления родительского объекта со связанными детьми я делаю что-то вроде этого:
public virtual T GetById(int id)
{
return this.DBSet.Find(id);
}
public virtual void Delete(T entity)
{
DbEntityEntry entry = this.Context.Entry(entity);
if (entry.State != EntityState.Deleted)
{
entry.State = EntityState.Deleted;
}
else
{
this.DBSet.Attach(entity);
this.DBSet.Remove(entity);
}
}
Сначала я найти родительский объект по идентификатору, а затем передать его удаление метод изменения состояния для удаления. Контекст .SaveChanges(), наконец, завершает удаление.
Это сработало отлично. Метод find только остановил объект «Родитель» и «Удалить», так как у меня есть каскад при удалении, который включен в «Дети».
Но в тот момент я добавил еще одно свойство в классе детей:
[ForeignKey("Gender")]
public int GenderId { get; set; }
public virtual Gender Gender { get; set; }
По какой-то причине EF потащил связанных детей по методу Parent.Find(). Из-за этого я получаю следующее сообщение об ошибке:
The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
Даже после возвращения изменений (удаления собственности Гендерной) проблема все еще существует. Я не могу понять это странное поведение !!
Все, что я хочу сделать, это удалить родительский объект вместе с детьми. Есть несколько решений вокруг него, но никто на самом деле не служит своей цели:
- Turn LazyLoading ложь - this.Configuration.LazyLoadingEnabled = ложь; Это работает, но в моем реальном приложении мне нужно, чтобы это свойство было истинным.
- Сначала идите всех детей и удалите их, а затем удалите родителя. Это, в лучшем случае, обходное решение и очень многословно.
- Используйте Remove() вместо того, чтобы просто изменять EntityState на Deleted. Мне нужно отслеживать изменения для аудита, поэтому там помогает EntityState.
Может кто-нибудь объяснить, почему EF загружает связанные объекты, даже если я их не использую?
Когда вы вернулись, вы также вернули БД? Вероятно, ваша проблема связана с БД. – Sefe
Да, я сделал. Я бросил БД и воссоздал ее. –
Я сомневаюсь, что это связано с БД, потому что я могу удалить родительский объект с запросом sql и каскадом при удаленных работах для детей. –