【问题标题】:Can I use Data Annotations to perform a Cascade Delete with Entity Framework 4.1 RC?我可以使用数据注释通过 Entity Framework 4.1 RC 执行级联删除吗?
【发布时间】:2011-04-06 15:38:39
【问题描述】:

在 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; }
}

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

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

如果不是怎么实现的?

【问题讨论】:

    标签: .net entity-framework entity-framework-4.1


    【解决方案1】:

    在 Product 表 Category 关系字段上放置 required 解决了这个问题

    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
    
        [Required]  //<======= Forces Cascade delete
        public Category Category { get; set; }
    }
    

    【讨论】:

    • 很有创意。谢谢。
    • 删除什么会删除什么?
    • 搜索ef core foreign key annotation cascade delete 没有发现任何结果。您的评论按预期工作。谢谢
    【解决方案2】:

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

    【讨论】:

    • 这比选择的答案要好,因为 Requiered 属性实现了一个不可为空的外键。它适用于 EF 6。谢谢!
    • 很好的解决方案,另外,请注意应将 Convention 类添加到 OnModelCreating 方法中的 modelBuilder.Conventions 中。
    • 这似乎只适用于 [Required] 关系,所以在我的例子中,为了清楚起见,我修改了 CascadeDeleteAttribute 以从 RequiredAttribute 继承
    【解决方案3】:

    不确定Data Annotations,但可以通过修改实际关系将其添加到数据库中。

    看起来数据注释的答案是否定的: http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/394821ae-ab28-4b3f-b554-184a6d1ba72d/

    这个问题似乎展示了如何使用流利的语法来做到这一点,但不确定这是否适用于 4.1 RC EF 4.1 RC: Weird Cascade Delete

    【讨论】:

      【解决方案4】:

      作为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; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        • 1970-01-01
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        • 2016-11-09
        相关资源
        最近更新 更多