【问题标题】:Cascading delete with Entity Framework使用实体框架级联删除
【发布时间】:2015-06-03 21:46:54
【问题描述】:

我有一个 cmets 表,其中包含列 Id - 评论的 ID,Commenter_Id 发布它的用户的 ID,以及 ParentComment_Id 一个自引用外键。评论只有两个级别,父级和子级。如果评论记录的 ParentComment_Id 为 null,则它是父评论。

我正在尝试编写一个表达式来删除用户的所有 cmets,但由于我之前提到的自我引用,这会导致问题。

以这个记录示例为例:

ID 为 2 的用户发布了一条 ID 为 3 的评论。因为这是父评论,所以它的 ParentComment_Id 值为 null。稍后,ID 为 1 的用户使用子评论回复该评论,创建评论 7(这两者之间还有其他 cmets/subcmets,因此 Id 增量跳转)。

我无法删除评论 ID 3,因为子评论评论 ID 7 有一个外键。

目前我尝试删除 cmets 的实体框架语句如下:

context.Comments.Where(x => x.Commenter.Id == user.Id).Delete();

但由于所描述的问题,这给了我一个例外。

我可能可以使用一些 foreach 循环来解决这个问题,但我希望有一种更简单的方法,比如 context.Cascade().Where(...。对于那些想知道Delete() 方法是 EntityFramework.Extended 包的一部分的人。

【问题讨论】:

  • 如果评论被删除,您是否希望所有子 cmets 也被删除,或者您希望他们的 ParentComment_Id 发送为 null?
  • 我要删除所有子cmets。

标签: c# entity-framework


【解决方案1】:

如果你有这样的实体:

public class Comment
{
  public int Id{get;set;}
  public int? ParentCommentId{get;set;}

  public virtual Comment ParentComment{get;set;}
  public virtual ICollection<Comment> Comments{get;set;}
}

你可以试试这个配置:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Comment>()
                .HasOptional(c=>c.ParentComment)
                .WithMany(c=>c.Comments)
                .HasForeignKey(c => c.ParentCommentId) 
                .WillCascadeOnDelete(true);
}

您可以使用WillCascadeOnDelete 方法在关系上配置级联删除。如果依赖实体上的外键可以为空,Code First 不会在关系上设置级联删除,当主体被删除时,外键将被设置为空。

【讨论】:

    【解决方案2】:

    您可以尝试将其添加到您的 dbcontext 中

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Comments>()
                    .HasForeignKey(d => d.ParentCommentId) 
                    .WillCascadeOnDelete(true);
    }
    

    【讨论】:

    • 这看起来不错,有没有办法将所有实体设置为级联而不重复该语句n次?
    • 您也许可以添加 modelBuilder.Conventions.Add() modelBuilder.Conventions.Add()。不过没试过。
    • 我正在这样做:modelBuilder.Entity&lt;Comment&gt;().WillCascadeOnDelete(true); 的 DbSet 为 public DbSet&lt;Comment&gt; Comments{ get; set; },但是它没有找到您的 WillCascadeOnDelete。我在 EF 6
    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多