2011-04-06 16 views
24

在EF4.1 RC中使用數據註釋時是否存在導致級聯刪除的註釋?我可以使用數據註釋執行實體框架4.1 RC級聯刪除嗎?

public class Category 
{ 
    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Category Category { get; set; } 
} 

採用這種模式產生的約束是:

ALTER TABLE [Product] ADD CONSTRAINT [Product_Category] 
FOREIGN KEY ([Category_Id]) REFERENCES [Categorys]([Id]) 
ON DELETE NO ACTION ON UPDATE NO ACTION; 

如果不是它是如何實現的?

回答

39

把需要在產品表類別關係字段解決此問題

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    [Required] //<======= Forces Cascade delete 
    public Category Category { get; set; } 
} 
+0

非常有創意。謝謝。 – 2017-01-11 16:56:46

+0

刪除後會刪除什麼? – Shimmy 2017-07-02 21:14:04

26

我喜歡關閉級聯刪除默認情況下(通過刪除OneToManyCascadeDeleteConvention

我當時希望通過註釋將它們添加回來,但對於EF不包含CascadeDeleteAttribute感到驚訝。

花費的時間太長了各地的EF可笑內部訪問級別工作後,在此要點的代碼添加了一個約定,允許屬性使用:https://gist.github.com/tystol/20b07bd4e0043d43faff

使用,只需貼在[CascadeDelete]在導航的兩端屬性,並在DbContext的OnModeCreating回調中添加約定。例如:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 
    modelBuilder.Conventions.Add<CascadeDeleteAttributeConvention>(); 
} 

而在你的模型:

public class BlogPost 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    [CascadeDelete] 
    public List<BlogPostComment> Comments { get; set; } 
} 
+3

這比選擇的答案要好,因爲Requiered屬性實現了一個不可爲空的外鍵。它適用於EF 6.謝謝! – rafael 2015-12-11 18:59:54

+0

這是 - 真棒。 – jmichas 2015-12-13 04:15:51

+1

偉大的解決方案,請注意,Convention類應該被添加到'OnModelCreating'方法中的'modelBuilder.Conventions'中。 – Alireza 2016-06-26 13:52:58

0

作爲一個附加的例子Tyson's answer,我用的是[CascadeDelete]屬性類似如下的一個實體,它成功地增加了「級聯」刪除規則的Parent - Child關係。

public class Child 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key] 
    [SkipTracking] 
    public Guid Id { get; set; } 

    [CascadeDelete] 
    public virtual Parent Parent { get; set; } 

    [Required] 
    [ForeignKey("Parent")] 
    public Guid ParentId { get; set; } 
}