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