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 Documentation为acceptChangesDuringSave
参数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)
这应该意味着更改跟踪器中的所有对象仍将具有 Modified
或 Added
的状态,随后对 SaveChanges()
的调用将再次保留它们。
尝试删除 false 参数,或者根本不在您的各种方法中调用 SaveChanges()
,稍后再调用一次
我正在尝试在事务中执行几个相关的插入操作,但出于某种原因,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 Documentation为acceptChangesDuringSave
参数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)
这应该意味着更改跟踪器中的所有对象仍将具有 Modified
或 Added
的状态,随后对 SaveChanges()
的调用将再次保留它们。
尝试删除 false 参数,或者根本不在您的各种方法中调用 SaveChanges()
,稍后再调用一次