关于插入重复记录,我的情况非常奇怪。 我正在根据某些标准检索记录,在修改了几个属性之后,我再次重新插入整个对象集合,甚至没有更改对象的主键值。
但我没有得到预期的结果。我嵌套在父集合中的所有集合从未完全添加到数据库中。
我不知道,出了什么问题。我是否需要完全分离所有这些实体? 我已经使用NoTracking()检索实体,甚至在修改它的属性时分离父实体。
我的父集合是寄售,并将子实体包含为列表" ConsignmentLine"
My Entity heirarchy是:
public class Consignment
{
public int ConsignmentId { get; set; }
public int ClientSubsidiaryId { get; set; }
public int ForwarderId { get; set; }
public int ClientId { get; set; }
public ICollection<ConsignmentLine> ConsignmentLines { get; set; }
public Consignment()
{
ConsignmentLines = new List<ConsignmentLine>();
}
}
public class ConsignmentLine
{
public int ConsignmentLineId { get; set; }
public int PackagingId { get; set; }
public double Amount { get; set; }
public double Weight { get; set; }
public int ConsignmentId { get; set; }
public virtual Consignment Consignment { get; set; }
}
我的代码涉及的步骤:
检索数据:
var Consignments = _dbContext.Consignments.AsNoTracking().Where(Pr => ( Pr.SourceParty == 0 && Pr.ParentId == null && Pr.ConnectState>=4 ) ).ToList();
修改几个属性。
consignments.ForEach(
(consignment) =>
{
consignment.ClientId = clientId;
_dbContext.Entry(consignment).State = System.Data.Entity.EntityState.Detached;
consignment.ForwarderId = forwarderId;
consignment.ClientSubsidiaryId = clientSubsidiaryId;
});
因为我知道,货物有&gt; 250000条记录。
const int BulkSize = 1000;
var SkipSize = 0;
try
{
while (SkipSize < consignments.Count)
{
ProcessableConsignments = consignments.Skip(SkipSize).Take(BulkSize).ToList(); _dbContext.Configuration.AutoDetectChangesEnabled = false;
dbContext.Consignments.AddRange(ProcessableConsignments);
var changedRecords = _dbContext.SaveChanges();
SkipSize = SkipSize + BulkSize;
}
}
catch (Exception ex)
{
throw;
}
我不知道我在这里失踪了什么。 所有我需要重新插入包含各种其他子实体的整个BULK记录作为第二次集合(实际上是循环N次)作为新BULK。
答案 0 :(得分:0)
我相信当你从上下文中分离已经分离的实体时,你有效地指示上下文在它们添加回上下文时忽略这些实体。 此外,由于性能原因,我强烈建议您不要在批量更新中使用EF。至少为每个事务创建新的上下文,在其他情况下,每个下一个批处理的处理时间都会增长。