Я использую подход Code-first EF, за исключением того факта, что я управляю базой данных (для проблем с изменением схемы, которые, как я считаю, все еще существуют в коде-first).У меня есть следующие таблицы / объекты модели (исключая несколько параметров и т. Д.):
class A {
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public virtual List<B> BList {get;set;}
public virtual List<C> CList {get;set;}
}
class B {
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("A"), Required]
public int AId {get; set;}
public virtual A parent {get;set;}
public virtual List<D> DList {get;set;}
}
class C {
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("A"), Required]
public int AId {get;set;}
[ForeignKey("someD"), Required]
public int someDId {get;set}
public virtual D someD
}
class D {
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("B"), Required]
public int BId {get;set;}
public string data {get;set;}
}
Это еще не все, но идея в том, что из родительского объекта A я могу перейти к D вдольдва разных отношения.Отношения каскадного удаления в базе данных установлены так, что A-> B, A-> C и B-> D являются каскадами;C-> D - это «бездействие».
Поэтому, когда я иду, чтобы удалить A (DbSet.Remove (a); SaveChanges (); и т. Д.), EF должен сначала удалить ветку C, чтобы потом можно было удалить D и не нарушатьFK ограничение C-> D.Однако, похоже, что он выбирает другой путь, так как удаление вызывает исключение о нарушении указанного ограничения.Есть ли способ для меня, чтобы дать подсказку (атрибут или иное) для EF, чтобы сказать ему что-то еще об этих отношениях, чтобы он мог удалять вещи в правильном порядке?
edit Добавлена больше ясности в подход в коде;Кроме того, мне приходит в голову эта мысль: я не фиксирую явно отношение C-> D на конце D, то есть на D нет свойства навигации, указывающего на C;потому что C является частью схемы Table-per-type, и не все D указывают на хорошую коллекцию базового класса C.Нужно ли иметь какое-то свойство навигации в D обратно в C для EF, чтобы понять, что я хочу?