[英]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; }
}
在查询父级时包括子级,如下所示:
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.