我试图在事务中进行一些相关的插入,并且出于某种原因,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,对于另一个元数据项,等等...)
我在这里错过了什么吗?
答案 0 :(得分:2)
根据acceptChangesDuringSave
ObjectContext.SaveChanges
参数的MSDN Documentation
如果为true,则重置所有对象的更改跟踪 SaveChanges(布尔)完成。如果是假的,你必须打电话给 SaveChanges(布尔)后的AcceptAllChanges方法
这应该意味着更改跟踪器中的所有对象仍然具有Modified
或Added
状态,随后对SaveChanges()
的调用将再次保留它们。
尝试删除false参数,或者不要在各种方法中调用SaveChanges()
,稍后再调用