【问题标题】:Cascade delete in entity framework实体框架中的级联删除
【发布时间】:2014-12-04 12:00:23
【问题描述】:

我在实体框架 6 中设置关系和进行级联删除工作时遇到问题。

我有以下物品

public class Module {
    public long Id { get; set; };
    public virtual ICollection<Group> Groups { get; set; };
}

public class Group {
    public long Id { get; set; };
    public virtual ICollection<Field> Fields { get; set; };
}

public class Field {
    public long Id { get; set; };
    public virtual FieldLink Link { get; set; };
}

public class FieldLink {
    public long Id { get; set; };
    public virtual Module LinkToModule { get; set; };
}

现在一个模块有组,一个组有字段,一个字段可以有一个链接。一个链接会有一个 LinkToModule,但这可以是一个不同的模块,而不是父字段/组所属的模块。

我已经建立了这样的关系

public ModuleConfig() 
{
    this.ToTable("Module");
}

public FieldGroupConfig() 
{
    this.ToTable("FieldGroup");

    // relationships
    this.HasRequired(e => e.Module)
        .WithMany(e => e.Groups)
        .HasForeignKey(e => e.ModuleId);
}  

public FieldConfig() 
{
    this.ToTable("Field");

    this.HasRequired(e => e.FieldGroup)
        .WithMany(e => e.Fields)
        .HasForeignKey(e => e.FieldGroupId);


    this.HasOptional(e => e.Link)
        .WithRequired(e => e.Field);

}

public FieldLinkConfig() 
{
    this.ToTable("FieldLink");

    this.HasRequired(e => e.LinkToModule)
        .WithMany()
        .HasForeignKey(e => e.LinkToModuleId);
}

现在我正在运行我的测试,我收到以下错误

Test method ModuleServiceTests.ModuleService_DeleteAsync_ByEntity threw exception: 

System.Data.SqlClient.SqlException: The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.FieldLink_dbo.Field_Id". The conflict occurred in database "TestDb", table "dbo.FieldLink", column 'Id'.

如果我检查关系,它在表 Field.Id > FieldLink.Id 之间,并且 DELETE 规则设置为 NO ACTION。很好,所以我想我需要更新这种关系并使用 WillCascadeOnDelete(true)

所以我从

更新了 FieldConfig 中的代码
this.HasOptional(e => e.Link)
    .WithRequired(e => e.Field);

this.HasOptional(e => e.Link)
    .WithRequired(e => e.Field)
    .WillCascadeOnDelete(true);

但是现在当我尝试运行我的测试时,甚至没有创建数据库,我收到错误提示

Initialization method Test.TestInitialize threw exception. 
System.Data.SqlClient.SqlException: Introducing FOREIGN KEY constraint 'FK_dbo.FieldLink_dbo.Field_Id' on table 'FieldLink' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

有人可以帮忙吗?我是否错误地建立了关系,我是否走错了路?

【问题讨论】:

    标签: c# sql entity-framework entity-framework-6


    【解决方案1】:

    MS SQL Server 不支持级联删除操作中的循环。您只需选择两个方向中的一个来级联删除或找到类似answer 的解决方法(触发器的示例是Listing 6 中的here)。这个answer 也包含一些见解。

    【讨论】:

    • 因此,如果有人删除了一个模块,我必须手动编写所有指向该模块的 FieldLinks,先删除,然后删除该模块,让 sql 级联其余的?
    • 您可以只选择一个方向级联删除或手动解决(使用INSTEAD OF触发器,在代码等)。我添加了一些指向答案的链接。
    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多