簡體   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