【发布时间】:2014-12-27 12:32:04
【问题描述】:
我在实体框架中在 3 个表之间配置复合键时遇到了一点问题,代码优先方法。我有一个具有 Id 的基类,我的所有类都继承自该 Id。第一个表具有第二个表项的集合,而它具有第三个表的集合。从任一表中删除元素时,我需要用于级联删除的复合键。我也在使用聚合根模式。
public abstract class BaseClass
{
[Key, Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
}
public class Table1 : BaseClass
{
public virtual ICollection<Table2> Table2Collection { get; set; }
public string Name { get; set; }
}
public class Table2 : BaseClass
{
public Table1 Table1 {get; set;}
[Key, ForeignKey("Table1"), Column(Order=1)]
public long Table1ID { get; set; }
public virtual ICollection<Table3> Table3Collection { get; set; }
public string Name { get; set; }
}
public class Table3 : BaseClass
{
[Key, ForeignKey("Table2Id,Table1Id"), Column(Order = 1)]
public Table2 Table2 { get; set; }
public long Table2Id{ get; set; }
public long Table1Id{ get; set; }
public string Name { get; set; }
}
当我删除表 1 或表 2 类型的元素时,上面的代码可以正常工作,但它不允许我从表 3 中删除一个元素,给我以下异常:
“由于一个或多个外键属性不可为空,因此无法更改关系。当对关系进行更改时,相关的外键属性将设置为空值。如果外键属性-key 不支持空值,必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。”
Bellow 是我的模型构建器:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Table2>()
.HasRequired(x=>x.Table1)
.WithMany(x =>x.Table2Collection)
.WillCascadeOnDelete(true);
modelBuilder.Entity<Table3>()
.HasRequired(x=>x.Table2)
.WithMany(x =>x.Table3Collection)
.WillCascadeOnDelete(true);
}
我怀疑我可能没有正确配置模型构建器,但我似乎无法弄清楚如何配置它以允许删除 Table3 类型的元素。任何帮助将不胜感激。
【问题讨论】:
标签: c# entity-framework ef-code-first composite-key