上午,我用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後,嘗試了幾個小時。 請指教。謝謝 !