C# 实体框架插入重复记录
我正试图在一个事务中插入一些相关的内容,出于某种原因,EF一直在插入多个重复的记录。我在这里能找到的最接近的问题是多对多问题,但这并不能解决我的问题 以下是我想做的: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
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中时,它们都工作得很好!你的暗示引起了人们的深思,因此我把它作为答案。再次感谢克里斯。