2014-12-04 154 views
0

我在设置实体框架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'. 

因为如果我检查的关系,它是表格字段之间.Id> FieldLink.Id和DELETE规则设置为NO ACTION。好吧,所以我想我需要更新的关系,并使用WillCascadeOnDelete(真)

所以我更新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. 

有人可以有帮助吗?我有没有建立一个关系不正确,我对此有错误的方式吗?

回答

0

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

+0

所以如果有人删除了一个模块,我会手动编码,指向该模块的所有FieldLinks,首先被删除,然后删除该模块,让其他级联? – Gillardo 2014-12-04 12:47:37

+0

您可以只选择一个方向来级联删除或手动解决它(使用'INSTEAD OF'触发器,在代码中等)。我已经添加了一些链接到答案。 – alik 2014-12-04 13:05:47