InvoiceDetail を Entity Framework で保存するときに、Tax 情報が削除されているかどうかを確認します。Tax が残っている場合は、Tax の DbSet 内に既に Tax があるかどうかを確認します。このオブジェクトへの参照が必要なためです。 InvoiceDetail に。これを行うには、単純に Local プロパティをチェックし、Local から Tax を取得します。
if (formInvoiceDetail.Tax != null) {
if (formInvoiceDetail.Tax.ID == 0) {
databaseInvoiceDetail.Tax = null;
}
else {
if (!Database.Set<Tax>().Local.Any(e => e.ID == formInvoiceDetail.Tax.ID)){
Database.Taxes.Attach(formInvoiceDetail.Tax);
}
databaseInvoiceDetail.Tax = Database.Set<Tax>().Local.Single(e => e.ID == formInvoiceDetail.Tax.ID);
}
}
問題は、ID が Tax の DbSet で重複しているため、Single がクラッシュするシナリオがあることです。
これは、前の操作で追加の既存の税情報を設定した場合に発生します (たとえば、最初の読み込みで InvoiceDetail を税オブジェクト (その ID のみ) と共に読み込み、後で invoiceDetail.Tax = fullLoadedTax を変更します)。
DbSet に重複したデータがなく、常に「最も正確な」データが必要な場合は、どうすればよいでしょうか?