我尝试遵循各种指南和示例,但无法解决。这是我从链接到母版的明细表中删除一行时遇到的错误
操作失败:由于一个或多个外键属性不可为空,因此无法更改关系。对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
案例测试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(无)
我不知道该怎么办。 你能帮我吗?
答案 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