[英]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.