繁体   English   中英

如何使用实体框架删除外键记录?

[英]How to delete a foreign key record with Entity Framework?

我有两个模型 - Parent 和 Child。 当我删除父项时,我希望子项会被删除,因为它具有 ForeignKey 属性,但事实并非如此。 我可以在父存储库的 Delete 方法中添加逻辑,如下面注释掉的代码所示,但我想知道是否需要这样做,是否有更简单的方法来解决这个问题?

public record Parent
{
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; }
}

public record Child
{
    [Key]
    public Guid Id { get; set; }
    [ForeignKey("Parent")]
    public Guid ParentId { get; set; }
    public string Name { get; set;}
}

public void Delete(Guid id)
{
    /*
    var children = _dbContext.Childs.Where(c => c.ParentId == id);
    if (children != null)
    {
        foreach (var child in children)
        {
            _dbContext.Childs.Remove(child);
        }
    }
    */

    var parent = _dbContext.Parents.FirstOrDefault(p => p.Id == id);
    if (parent != null)
    {
        _dbContext.Parents.Remove(parent);
    }
    
    _dbContext.SaveChanges();
}

如果 databaseContext 快照中的模型具有“.OnDelete(DeleteBehavior.Cascade)”,您可以只包含该表,子数据将被删除。

var parent = _dbContext.Parents.Include(parent => parent.Children).FirstOrDefault(p => p.Id == id);

为此,您还应该在父模型中列出子项:

public record Parent
{
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; }

    public IEnumerable<Child> Children { get; set; }
}

这是 Microsoft 文档的链接

在查询父级时包括子级,如下所示:

    var parent = _dbContext.Parents
        .include(p => p.Child)
        .FirstOrDefault(p => p.Id == id);

然后像你已经做的那样调用 remove 。

此外,您可能需要考虑 OnDelete 行为来定义当您删除 Parent 时 Child 发生的情况。 如果您希望在删除父级时删除子级,请使用“级联”删除行为。 这可以在子表定义中的数据库级别完成,类似于以下内容:

CONSTRAINT [FK_Childs_Parents_ParentId] FOREIGN KEY ([ParentId]) REFERENCES [Parent]  ON DELETE CASCADE 

或在 EF 上下文级别,如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Parent>()
        .HasMany(e => e.Childs)
        .WithOne(e => e.Parent)
        .OnDelete(DeleteBehavior.ClientCascade);
}

微软官方文档的更多相关细节 在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM