我遇到了EntityFramework和以下数据模型的问题(参见简化图)。
可以将物质对象视为"主要容器"。有Bill和BillRecord。从Bill到BillRecord有一对多的关联。确切地说,一个Bill可以引用很多BillRecord(可能是0),BillRecord最多只能引用一个账单。
1)我希望能够删除BillRecord但是如果存在关联则不应该删除Bill(这就是我没有在BillRecords实体上设置OnCascadeDelete For Bill的原因)。同样,如果我删除了一个账单,我不想删除可能与之关联的BillRecord。
2)然而,当我删除一个问题时,我希望一切都消失:问题,比尔和比尔记录。
使用以下代码,如果没有与Bill相关联的BillRecord,我设法有1)正确和2)工作,如果有,我得到以下错误。
System.Data.SqlServerCe.SqlCeException: The primary key value cannot be deleted because references to this key still exist. [ Foreign key constraint name = FK_dbo.BillRecordDboes_dbo.BillDboes_BillId ]
这是我的实体和OnModelCreating的逻辑
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MatterDbo>().HasMany<BillRecordDbo>(s => s.BillRecordDbos)
.WithRequired(s => s.Matter).HasForeignKey(s => s.MatterId).WillCascadeOnDelete(true);
modelBuilder.Entity<MatterDbo>().HasMany<BillDbo>(s => s.BillDbos)
.WithRequired(s => s.Matter).HasForeignKey(s => s.MatterId).WillCascadeOnDelete(true);
}
public class MatterDbo
{
public MatterDbo()
{
BillDbos = new List<BillDbo>();
BillRecordDbos = new List<BillRecordDbo>();
}
public Guid Id { get; set; }
public virtual List<BillDbo> BillDbos { get; set; }
public virtual List<BillRecordDbo> BillRecordDbos { get; set; }
}
public class BillRecordDbo
{
public Guid Id { get; set; }
public Guid MatterId { get; set; }
public virtual MatterDbo Matter { get; set; }
public Guid? BillId { get; set; }
public virtual BillDbo Bill { get; set; }
}
public class BillDbo
{
public BillDbo()
{
BilledRecords = new List<BillRecordDbo>();
}
public Guid Id { get; set; }
public virtual List<BillRecordDbo> BilledRecords { get; set; }
public Guid MatterId { get; set; }
public virtual MatterDbo Matter { get; set; }
}
当然,当删除一个问题时,我可以手动检查并删除Bill和BillRecords的所有关联,但我认为这将是EF的错误用法。
我使用的是EntityFramework 6.0和SQL CE,目标是.NET 4.0
非常感谢。
答案 0 :(得分:1)
如果您确实需要BillRecord保留在数据库中,如果其父级Bill实体被删除,则必须在删除父级之前将parent属性设置为null。但是,在数据库中拥有可空的FK通常表明可能有更好的数据库设计解决方案。