【问题标题】:c# EntityFramework version 6.1.3 NOT DELETE DETAILc#EntityFramework 6.1.3版不删除细节
【发布时间】:2019-02-25 07:29:18
【问题描述】:

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

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

案例测试 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(无)

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

【问题讨论】:

  • 问题的第一部分应该是对您的问题的描述,然后是您得到的错误,然后是您尝试过的内容。请也格式化您的代码。
  • 抱歉,我通过 entityFramework 6 创建了到 SQLSERVER 的连接。我必须管理主表和详细表(子表)的数据。我设法查看,编辑但没有删除,因为我给出了错误操作失败:......(如上所述)我已经尝试过,我发现很多人都有同样的问题。这里有一些测试。我解决不了

标签: c# entity-framework


【解决方案1】:

对于 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;这意味着如果您删除 Master 所有详细信息都需要删除(否则您也会收到您提到的错误)。如需进一步参考,请查看here

【讨论】:

  • 试过了。一样的错误!操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2016-01-02
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多