2014-09-29 116 views
0

上午,我用Code First來構建我的數據庫,並且實現了Table per Type(TPT)方法的繼承層次結構。正如下面是我的項目的樣本模型:Code First Cascade刪除

public enum Type 
{ 
    A = 0, 
    B = 1 
} 

public abstract class Device 
{ 
    public int DeviceId { get; set; } 
    public Type Type { get; set; } 
} 

[Table("DeviceA")] 
public class DeviceA : Device 
{ 
    public int Value { get; set; } 
} 

[Table("DeviceB")] 
public class DeviceB : Device 
{ 
    public int Value { get; set; } 
} 

而且我有一個表,這是如下圖所示的模型與既有& B.:

public class Sir 
{ 
    public int SirId { get; set; } 

    [Required] 
    public virtual DeviceA DeviceA { get; set; } 

    public virtual DeviceB DeviceB { get; set; } 
} 

而且OnModelCreating功能如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<Sir>() 
      .HasRequired(s => s.DeviceA) 
      .WithMany() 
      .WillCascadeOnDelete(true); 

     modelBuilder.Entity<Sir>() 
      .HasOptional(s => s.DeviceB) 
      .WithMany() 
      .WillCascadeOnDelete(false); 

     base.OnModelCreating(modelBuilder); 
    } 

問題是,當我試圖刪除超類中的設備時, SQL錯誤提示:

DELETE語句與REFERENCE約束「FK_dbo.DeviceA_dbo.Devices_DeviceId」衝突。數據庫「CodeFirst」,表「dbo.DeviceA」,列「DeviceId」發生衝突。

據我明白,根據http://msdn.microsoft.com/en-us/data/jj591620.aspx MSDN文檔(主管的啓用級聯刪除標題部分),它指出。如果依賴實體上的外鍵不可爲空,則Code First會在關係上設置級聯刪除。如果依賴實體上的外鍵可爲空,則Code First不會在關係上設置級聯刪除,並且在刪除委託人時,外鍵將設置爲空。

但是,仍然沒有級聯刪除超級類中的記錄A後,嘗試了幾個小時。 請指教。謝謝 !

回答

0

嘗試映射外鍵:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

    modelBuilder.Entity<Sir>() 
     .HasRequired(s => s.DeviceA) 
     .WithMany() 
     .Map(m => m.MapKey("DeviceA_Id")) 
     .WillCascadeOnDelete(true); 

    modelBuilder.Entity<Sir>() 
     .HasOptional(s => s.DeviceB) 
     .WithMany() 
     .Map(m => m.MapKey("DeviceB_Id")) 
     .WillCascadeOnDelete(false); 

    base.OnModelCreating(modelBuilder); 
}