2014-12-04 170 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