c#EntityFramework版本6.1.3未删除详细信息

时间:2019-02-25 07:29:19

标签: c# entity-framework

我尝试遵循各种指南和示例,但无法解决。这是我从链接到母版的明细表中删除一行时遇到的错误

  

操作失败:由于一个或多个外键属性不可为空,因此无法更改关系。对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

案例测试1:

using (var context = new clsDB.Entities())
{
    var DELETETEST= (from o in context.Tab_Master.Include("Tab_Details") where o.IdMaster == 472 select o).FirstOrDefault();
    if (DELETETEST!= null)
    {
        var detail = DELETETEST.Tab_Details.First();
        DELETETEST.Tab_Details.Remove(detail);

        context.SaveChanges();
    }
}

案例测试2:

public class Docume : DbContext
{

    public Entities DocumeTest { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<Tab_Master>()
                    .HasKey(x => x.IdMaster);
        modelBuilder.Entity<Tab_Details>()
                    .HasKey(x => x.IdDetails);
        modelBuilder.Entity<Tab_Master>()
                    .HasMany(x => x.Tab_Details)
                    .WithRequired()
                    .HasForeignKey(x => x.IdTab_Master)
                    .WillCascadeOnDelete(false);

    }
}

我检查了关系END1(级联)和END2(无)

我不知道该怎么办。 你能帮我吗?

1 个答案:

答案 0 :(得分:0)

对于Case1,您只是删除外键关系,而没有真正从数据库中删除Tab_Details。解决该问题的一种方法是使用:

context.Tab_Detail.Remove(detail);

代替:

DELETETEST.Tab_Details.Remove(detail);

我不确定这是否会使您的Case2无关紧要,但是现在我建议只切换一行。

如果可能的话,我只会从数据库中获取Tab_Detail,例如使用

var detail = (from d in context.Tab_Detail where d.IdTab_Master== 472 select o).FirstOrDefault();
if(detail != null)
{
    context.Tab_Detail.Remove(detail);
    context.SaveChanges();
}

假设一个大师只有一个细节;否则,如果您知道IdDetails,只需将其用于选择即可。

编辑:将Case2(OnModelCreating)的最后一部分更改为

modelBuilder.Entity<Tab_Master>()
            .HasMany(x => x.Tab_Details)
            .WithRequired(x => x.IdTab_Master)
            .WillCascadeOnDelete();

级联删除应设置为true;这意味着,如果您删除母版,则所有所有详细信息都需要删除(否则,您还会收到提到的错误)。要进一步参考,请看here