我正在做一个代码优先的EF方法,除了我正在管理数据库这一事实(对于我认为仍然存在于代码优先的模式更改问题)。我有以下表/模型对象(除了几个参数等):
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 - &GT; d。但是,它似乎是选择其他路径,因为删除会抛出有关违反所述约束的异常。有没有办法让我向EF提供一个提示(属性或其他)来告诉它关于这些关系的其他信息,以便它能以正确的顺序删除东西?
修改为代码中的方法添加了更多清晰度;此外,这个想法发生在我身上:我没有明确地从D-末端的C-> D中捕捉到关系 - 也就是说,D上没有指向C的导航属性;因为C是每个类型的方案的一部分,并不是所有的D都指向C的基类的良好集合。我是否需要在D中使用某种导航属性返回C以获取EF以了解我的需求?