C# 实体框架插入重复记录

C# 实体框架插入重复记录,c#,entity-framework,transactionscope,duplicate-data,C#,Entity Framework,Transactionscope,Duplicate Data,我正试图在一个事务中插入一些相关的内容,出于某种原因,EF一直在插入多个重复的记录。我在这里能找到的最接近的问题是多对多问题,但这并不能解决我的问题 以下是我想做的: public void UploadFilesToStorage(MetadataLineCollection metadata, string outputDirectory) { using (var scope = new TransactionScope(TransactionScopeOption

我正试图在一个事务中插入一些相关的内容,出于某种原因,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)

尽管如此,仍在创建多个相同的作业(但只有第一个作业具有指纹,因为其余作业具有不同的作业ID),并且每个元数据项也存储了多次!此外,重复的数量也不同(对于一个元数据项,它是8,对于另一个元数据项,它是3,等等)

我在这里遗漏了什么吗?

根据
ObjectContext.SaveChanges的
acceptChangesDuringSave
参数

如果为true,则所有对象上的更改跟踪将在 保存更改(布尔值)完成。如果为false,则必须调用 SaveChanges后的AcceptAllChanges方法(布尔值)

这意味着更改跟踪器中的所有对象仍将保持
已修改
已添加
的状态,随后对
SaveChanges()
的调用将再次保留它们


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

我不知道有这样的依赖关系,谢谢!虽然这带来了一个不同的问题,由于没有实际访问数据库,我没有从第一次调用中获得jobId-它总是等于零。因此,我必须坚持至少这种改变,因为其余的都取决于它。如果出现问题,也许我会尝试保存它,并在catch块中删除它?结果是,我可以在每个函数中放置独立的上下文,而当它们在TransactionScope中时,它们都工作得很好!你的暗示引起了人们的深思,因此我把它作为答案。再次感谢克里斯。