簡體   English   中英

在 EF Core 中使用現有子實體創建新實體

[英]Create new entity with an existing child entity in EF Core

我有三個具有一對多關系的模型(聯系人-> 帳戶-> 記錄):

public class Contact
{
    public int Id { get; set }
    public string Name { get; set; }

    public ICollection<Account> Accounts { get; set; }
}

public class Account
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Record> Records { get; set; }
    
    public int ContactId { get; set; }
    public Contact Contact { get; set; }
}

public class Record
{
    public int Id { get; set; }
    public string Name { get; set; }
    
    public int AccountId { get; set; }
    public Account Account { get; set; }
}

我使用 POST 請求創建新聯系人的方法:

public async Task<bool> PostContactAsync(Contact contact)
{
    var existingAccounts = _context.Accounts.Where(a => contact.Accounts.Select(x => 
        x.Name).Contains(a.Name)).ToList();

    if (contact.Accounts.Count != existingAccounts.Count)
            throw new ArgumentException("Can`t find specified account(s) in the database");

    await _context.Contacts.AddAsync(contact);
    await _context.SaveChangesAsync();

    return true;
}

和 JSON 請求正文以創建新聯系人

{
   "name": "Tom",
   "accounts": [
   {
      "name": "c4ece1a5-3614-4b17-93e0-d1189",
       "records": [
       {
          "name": "First record",
       },
       {
          "name": "Second record"
       }
     ]
   }
 ]
}

帳戶名稱是唯一的字符串字段標識符。 如果數據庫中已存在具有指定名稱的帳戶,則可以創建新聯系人 問題是 EF Core 正在嘗試創建一個新Account 挑戰是只創建一個新聯系人並附加到現有帳戶記錄

實體框架將使用 Id 字段來識別數據庫上的記錄,所以發生的事情是您正在添加一個新聯系人(即 ID 為零)但該聯系人上的帳戶的 ID 也為 0,這意味着實體框架也認為它是新的。 因此,它將另一個具有相同名稱(但 id 不同)的帳戶添加到數據庫中。 這也適用於記錄。

如果您的邏輯是聯系人始終是新的,您可以嘗試將聯系人添加到現有帳戶,如下所示:

public async Task<bool> PostContactAsync(Contact contact)
    {
        var existingAccounts = _context.Accounts.Where(a => contact.Accounts.Select(x =>
            x.Name).Contains(a.Name)).ToList();
        
        if (contact.Accounts.Count != existingAccounts.Count)
        {
            throw new ArgumentException("Can`t find specified account(s) in the database");
        }

        foreach (var existingAccount in existingAccounts)
        {
            existingAccount.Contact = new Contact{ Id = contact.Id, Name = contact.Name};
        }

        await _context.SaveChangesAsync();

        return true;
    }

當您這樣做時,聯系人將被添加到現有帳戶中。 不過,這對您來說遠非一個完整或理想的解決方案,因為:

  • 該帳戶的先前聯系人可能會保留在數據庫中
  • 您的示例中顯示的記錄條目只是被忽略
  • 對帳戶的任何更改都不會在數據庫中更新

如果您的方法只是添加一個新的聯系人,那么也許另一種方法可能是只傳入聯系人記錄而沒有任何帳戶/記錄子詳細信息)並有一個單獨的參數來指定應該添加的帳戶名稱/ID至。

暫無
暫無

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

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