Entity Framework 插入重复记录

Entity Framework inserting duplicate records

我正在尝试在事务中执行几个相关的插入操作,但出于某种原因,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 个,等等)

我是不是漏掉了什么?

根据MSDN DocumentationacceptChangesDuringSave参数ObjectContext.SaveChanges

If true, the change tracking on all objects is reset after SaveChanges(Boolean) finishes. If false, you must call the AcceptAllChanges method after SaveChanges(Boolean)

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

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