簡體   English   中英

如何覆蓋 EF Core 6 中的 List 屬性?

[英]How to override List property in EF Core 6?

我有一個問題,在數據庫中我有一個 object 的 class 目錄,在 CatalogUsers 中有 3 個元素。 我想用 2 元素列表替換該列表,這是沒有 1 position 的原始列表。我的目標是刪除新列表中遺漏的元素。

CatalogUsers 是目錄和用戶之間的多對多關系

public class Catalog
{
    [Key, Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }

    public string DefaultCurrencyCode { get; set; }
    public virtual Currency? DefaultCurrency { get; set; }

    public virtual List<CatalogUser>? CatalogUsers { get; set; }
}

public class CatalogUser
{
    public int CatalogId { get; set; }
    public virtual Catalog? Catalog { get; set; }

    public int UserId { get; set; }
    public virtual User? User { get; set; }

    public CatalogUserRole Role { get; set; }
}
public class User
{
    [Key, Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string? Username { get; set; }
    public string? Email { get; set; }
    public string? Password { get; set; }

    public virtual List<CatalogUser>? CatalogUsers { get; set; }
}

現在我試着這樣做:

public async Task<int> UpdateAsync(Catalog model)
{
    var _catalog = await GetByIdAsync(model.Id);
    if (_catalog is null) return 0;
    _catalog.Name = model.Name;
    _catalog.DefaultCurrencyCode = model.DefaultCurrencyCode;
    _catalog.CatalogUsers = model.CatalogUsers;
    _context.Catalogs.Update(_catalog);
    return await _context.SaveChangesAsync();
}

但它不起作用缺少的元素仍在數據庫中

這可以使用級聯刪除來完成,如文檔中所述。

但是要發生級聯,需要修改被跟蹤的實體。 如果您用不包括已刪除項目的新列表替換該列表,則跟蹤將被切斷。 EF 將嘗試將列表中的元素與實體相匹配(甚至在數據庫中添加實體的副本),但不會將刪除的項目標記為刪除。

您需要手動從被跟蹤實體中刪除項目。 例如

public async Task<int> UpdateAsync(Catalog model)
{
    var _catalog = await GetByIdAsync(model.Id);
    if (_catalog is null) return 0;
    _catalog.Name = model.Name;

    foreach(var catalogUser in _catalog.CatalogUsers.
        .Where(cuIdDb => !model.CatalogUsers
            .Any(cuInModel =>
                // comparing by value, not reference e.g.:
                cuInModel.Id == cuIdDb.Id))
        .ToList()) // required as you are modifying the list
    {
        _catalog.CatalogUsers.Remove(catalogUser);
    }

    //_context.Catalogs.Update(_catalog);// shouldn't be required due to entity tracking
    return await _context.SaveChangesAsync();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM