DatabaseContext包含一个带有重复实体的DbSet,为什么?

时间:2012-06-11 15:53:09

标签: c# asp.net entity-framework entity-framework-4.3

当保存带有实体框架的InvoiceDetail时,我们检查税务信息是否已被删除,如果我们发现我们仍然有税,我们检查我们是否已经在税收的DbSet中有税,因为我们只想要参考将此对象发送到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);
    }                
}

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

当前一个操作设置了额外的现有Tax信息时(例如,第一个加载将使用Tax对象加载InvoiceDetail(只是其ID)以及稍后,将更改invoiceDetail.Tax = fullLoadedTax。

如果我们不想在DbSet中拥有重复数据并始终“最准确”的数据,我们该如何处理呢?

1 个答案:

答案 0 :(得分:1)

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

   invoiceDetail.Tax = fullLoadedTax

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

 Database.Taxes.ApplyCurrentValues(formInvoiceDetail.Tax);

应该更新内容,以便为您提供一致的,最新的设置,但如果ID首先正确设置为主键,然后尝试附加()a无论如何,具有相同键的第二条记录会在你的脸上爆炸,所以你可能还需要再看看你如何处理你的DbContext。