Ben*_*tra 5 c# entity-framework sql-server-ce
我在使用EntityFramework和以下数据模型时遇到了一些麻烦(参见简化图).

Matter对象可以被认为是"主要容器".有Bill和BillRecord.从Bill到BillRecord有一对多的关联.确切地说,Bill可以引用许多BillRecord(可能是0),BillRecord最多可以引用一个Bill.
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 ]
Run Code Online (Sandbox Code Playgroud)
这是我的实体和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; }
}
Run Code Online (Sandbox Code Playgroud)
当然,当删除一个问题时,我可以手动检查并删除Bill和BillRecords的所有关联,但我认为这将是EF的错误用法.
我正在使用EntityFramework 6.0和SQL CE目标.NET 4.0
非常感谢你.
如果您确实需要 BillRecord 在其父项 Bill 实体被删除时保留在数据库中,则必须在删除父项之前将 Parent 属性设置为 null。然而,数据库中具有可为空的 FK 通常表明可能有更好的数据库设计解决方案。
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |