2013-10-20 48 views
0

我已經使用實體框架5.0代碼第一種方法爲子模型定義級聯刪除。 現在,當對父表記錄執行刪除操作時,相應的子表記錄不會被刪除。子表具有父表的外鍵引用。 在下面,我附上我的機型代碼:級聯刪除EF5.0代碼第一種方法父表不能正確刪除?

//"Product" parent class 
public class Product 
{ 
    [Key, Column(Order = 0)] 
    [Required] 
    [MaxLength(50)] 
    public string Upc { get; set; } 

    public double Height { get; set; } 
    public double Width { get; set; } 
    public virtual List<ProductImages> ProductImages { get; set; } 

    public Product() 
    { 
     this.ProductImages = new List<ProductImages>(); 
    } 
} 


//"ProductImages" child class 
public class ProductImages 
{  
    [Key, Column(Order = 0)] 
    public string Upc { get; set; } 
    [ForeignKey("Upc")] 
    public virtual Product Product { get; set; } 
    [Key, Column(Order = 1)] 
    public short Orientation { get; set; } 
} 

//Cascade delete constraint 
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    modelBuilder.Entity<Product>() 
       .HasMany(t => t.ProductImages) 
       .WithRequired() 
       .HasForeignKey(d => d.Upc) 
       .WillCascadeOnDelete(true); 
} 

雖然刪除記錄,我發現了以下錯誤在
context.SaveChanges();

錯誤

操作失敗:該關係無法更改,因爲外鍵屬性的一個或多個 不可空。當對onship進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新關係,必須爲外鍵 指定另一個非空值,或者必須刪除不相關對象 。

任何人都可以幫我一下如何刪除父表記錄和子表記錄嗎?

謝謝, Sampath。

+0

你可以顯示代碼如何刪除父項? (點擊您的問題下面的「編輯」鏈接) – Slauma

回答

0

您的映射不正確。取而代之的.WithRequired()不帶參數必須爲逆導航屬性ProductImages.Product提供一個表達:

.WithRequired(d => d.Product) 

您必須使用WithRequired只有無參數版本的實體並沒有逆導航屬性。

+0

嗨,我已經嘗試通過修改上面的代碼行。我仍然遇到同樣的問題。請幫助我 謝謝,sampath –