实体框架插入重复记录

时间:2015-02-18 19:31:06

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

我试图在事务中进行一些相关的插入,并且出于某种原因,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)

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

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:2)

根据acceptChangesDuringSave

ObjectContext.SaveChanges参数的MSDN Documentation
  

如果为true,则重置所有对象的更改跟踪   SaveChanges(布尔)完成。如果是假的,你必须打电话给   SaveChanges(布尔)后的AcceptAllChanges方法

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

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