Предоставить Entity Framework советы о том, как / какой порядок каскадного удаления - PullRequest
2 голосов
/ 06 июля 2011

Я использую подход 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, чтобы понять, что я хочу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...