1

使用实体框架保存 InvoiceDetail 时,我们检查税收信息是否已被删除,如果我们看到我们仍然有税收,我们检查我们是否在税收的 DbSet 中已经有了税收,因为我们只想要对这个对象的引用到我们的 InvoiceDetail。为此,我们只需检查当地财产并从当地获取税款。

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);
    }                
}

问题是我们遇到了 Single 崩溃的情况,因为 ID 在 Tax 的 DbSet 中重复。

当先前的操作设置额外的现有税务信息时会发生这种情况(例如,第一次加载将使用税务对象(仅其 ID)加载 InvoiceDetail,稍后将更改 invoiceDetail.Tax = fullLoadedTax。

如果我们不想在 DbSet 中有重复的数据并且总是“最准确”的数据,我们该如何进行?

4

1 回答 1

1

是 ID 是实体映射的数据库中的主键,因为如果是这样,您获得的代码片段

   invoiceDetail.Tax = fullLoadedTax

违反了数据库的约束。令我震惊的是,您的问题在于这行代码,而不是您在问题中显示的任何内容。如果您正确地限定和更新您的本地数据库,它就不会违反其约束并且您不会遇到这个问题。当您搞乱 fullLoadedTax 时,请尝试使用ApplyCurrentValues

 Database.Taxes.ApplyCurrentValues(formInvoiceDetail.Tax);

应该会更新一些东西,以便为您提供一致的、最新的设置,但如果一开始就将 ID 正确设置为主键,那么尝试 Attach() 具有相同键的第二条记录将会崩溃无论如何,你的脸,所以你可能还需要再看看你是如何处理你的 DbContext 的。

于 2012-06-11T16:17:15.493 回答