【问题标题】:Entity Framework inserting duplicate records实体框架插入重复记录
【发布时间】:2015-04-19 23:10:00
【问题描述】:

我正在尝试在事务中进行一些相关的插入,但出于某种原因,EF 不断插入多个重复记录。我在这里能找到的最接近的是多对多问题,但这并不能解决我的问题。

这是我想要做的:

public void UploadFilesToStorage(MetadataLineCollection metadata, string outputDirectory)
    {
        using (var scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromMinutes(15)))
        using (var context = new DbEntities())
        {
            decimal newJobId = CreateNewJob(context, metadata.CommonMetadata.OriginalFileName);

            foreach (var item in metadata.Items)
            {
                var fingerprint= service.UploadFile(outputDirectory + "\\" + item.TifFileName);
                StoreFileInfo(context, newJobId, imageFingerprint, item);
            }

            var csvFingerprint = service.UploadFile(outputDirectory + "\\" + metadata.CsvFileName);
            StoreFingerprint(context, newJobId, csvFingerprint);
            CreateNewDelivery(context, newJobId);

            scope.Complete();
            context.AcceptAllChanges();
        }
    }

如您所见,我将相同的上下文传递给每个应该使用相关数据的函数。这些电话中的每一个都调用context.SaveChanges(false)。

仍然会创建多个相同的作业(但只有第一个具有指纹,因为其余作业具有不同的 jobId),并且每个元数据项也被存储多次!此外,重复的数量是不同的(一个元数据项是 8 个,另一个是 3 个,等等......)

我错过了什么吗?

【问题讨论】:

    标签: c# entity-framework transactionscope duplicate-data


    【解决方案1】:

    根据MSDN Documentation为acceptChangesDuringSave参数ObjectContext.SaveChanges

    如果为 true,则所有对象的更改跟踪在之后重置 SaveChanges(Boolean) 完成。如果为 false,则必须调用 SaveChanges(Boolean) 之后的 AcceptAllChanges 方法

    这应该意味着更改跟踪器中的所有对象仍将具有Modified 或Added 的状态,随后对SaveChanges() 的调用将再次保持它们。

    尝试删除 false 参数,或者在您的各种方法中根本不调用 SaveChanges(),稍后再调用它一次

    【讨论】:

    • 我不知道有这样的依赖,谢谢!尽管这带来了一个不同的问题,但由于实际上没有访问数据库,我没有从第一次调用中获得 jobId - 它始终等于零。所以我必须至少坚持这种改变,因为其余的都依赖于它。如果出现问题,也许我会尝试保存并在 catch 块中将其删除?
    • 原来我可以在每个函数中放置独立的上下文,并且当它们在 TransactionScope 中时,它们都运行良好!您的提示令人深思,因此我将其标记为答案。再次感谢克里斯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多