DatabaseContext 包含一个具有重复实体的 DbSet,原因
本文关键字:实体 DbSet 原因 包含一 DatabaseContext | 更新日期: 2023-09-27 18:36:53
当使用实体框架保存发票详细信息时,我们检查税务信息是否已被删除,如果我们看到我们仍然有税,我们检查我们是否已经在税收数据库集中有税,因为我们只想将此对象的引用到我们的发票详细信息。为此,我们只需检查本地属性并从本地获取税款。
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 在 DbSet of Tax 中重复。
当上一个操作设置其他现有税务信息(例如,第一次加载将使用 Tax 对象(仅其 ID)加载 InvoiceDetail,稍后将更改 invoiceDetail.Tax = fullLoadedTax 时,会发生这种情况。
如果我们希望 DbSet 中没有重复的数据并且始终"最准确"的数据,我们该如何进行?
Is ID 是 Entity 正在映射的数据库中的主键,因为如果是这样,您将获得的代码片段
invoiceDetail.Tax = fullLoadedTax
违反了数据库的约束。 令我震惊的是,您的问题出在这行代码上,而不是您在问题本身中显示的任何内容。 如果您正确限定并更新了本地数据库,则不会违反其约束,也不会遇到此问题。 当你弄乱 fullLoadedTax 时,请尝试使用 ApplyCurrentValues:
Database.Taxes.ApplyCurrentValues(formInvoiceDetail.Tax);
这应该更新内容以为您提供一致的、最新的设置,但说实话,如果 ID 首先被正确设置为主键,那么尝试 Attach() 具有相同键的第二条记录无论如何都会在你的脸上爆炸,所以你可能还必须再看看你如何处理你的 DbContext。