1

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 に重複したデータがなく、常に「最も正確な」データが必要な場合は、どうすればよいでしょうか?

4

1 に答える 1

1

ID は、エンティティがマッピングしているデータベースの主キーです。そうであれば、取得するコードのスニペット

   invoiceDetail.Tax = fullLoadedTax

データベースの制約に違反しています。あなたの問題は、あなたが質問で示したものではなく、このコード行にあると思います。ローカル データベースを適切に修飾して更新していれば、制約に違反することはなく、この問題は発生しません。fullLoadedTax をいじっている場合は、 ApplyCurrentValues を使用してみてください

 Database.Taxes.ApplyCurrentValues(formInvoiceDetail.Tax);

これにより、一貫性のある最新のセットアップが得られるように更新されるはずですが、正直なところ、ID が最初に主キーとして適切に設定されていた場合、同一のキーを持つ 2 番目のレコードを Attach() しようとすると失敗します。とにかくあなたの顔なので、DbContext の処理方法をもう一度確認する必要があるかもしれません。

于 2012-06-11T16:17:15.493 に答える