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



我有两个模型- 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();
}

在查询父类时包含子类,如下所示:

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

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

同样,你可能想要考虑OnDelete行为来定义当你删除父元素时子元素会发生什么。如果希望在删除父级时删除子级,请使用& Cascade"删除的行为。这可以在数据库级别的子表定义中完成,类似于以下操作:

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

更多相关细节请参考微软官方文档

如果模型在databaseContext快照".OnDelete (DeleteBehavior.Cascade)";你可以包括表和子数据将被删除。

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

要做到这一点,你还应该在父模型中创建一个Children列表:

public record Parent
{
[Key]
public Guid Id { get; set; }
public string Name { get; set; }
public IEnumerable<Child> Children { get; set; }
}

这是指向Microsoft文档的链接

最新更新