我可以使用数据注释来执行使用Entity Framework 4.1 RC进行级联删除吗?

Ben*_*der 37 .net entity-framework entity-framework-4.1

使用EF4.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; }
}
Run Code Online (Sandbox Code Playgroud)

使用此模型生成的约束是:

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

如果不是如何实现?

Ben*_*der 49

在Product表类别关系字段上放置必需解决此问题

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

    [Required]  //<======= Forces Cascade delete
    public Category Category { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 删除什么后删除什么? (3认同)

Tys*_*son 43

我喜欢默认关闭级联删除(通过删除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>();
}  
Run Code Online (Sandbox Code Playgroud)

在你的模型中:

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; } 
}
Run Code Online (Sandbox Code Playgroud)

  • 这比选择的答案更好,因为Requiered属性实现了一个不可为空的外键.它适用于EF 6.谢谢! (3认同)
  • 还有一个很好的解决方案,请注意,应该在`OnModelCreating`方法中将Convention类添加到`modelBuilder.Conventions`中. (2认同)