如何在实体框架

时间:2016-05-31 16:17:52

标签: c# linq linq-to-entities entity-framework-6 bulkinsert

关于插入重复记录,我的情况非常奇怪。 我正在根据某些标准检索记录,在修改了几个属性之后,我再次重新插入整个对象集合,甚至没有更改对象的主键值。

但我没有得到预期的结果。我嵌套在父集合中的所有集合从未完全添加到数据库中。

我不知道,出了什么问题。我是否需要完全分离所有这些实体? 我已经使用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。

1 个答案:

答案 0 :(得分:0)

我相信当你从上下文中分离已经分离的实体时,你有效地指示上下文在它们添加回上下文时忽略这些实体。 此外,由于性能原因,我强烈建议您不要在批量更新中使用EF。至少为每个事务创建新的上下文,在其他情况下,每个下一个批处理的处理时间都会增长。