我在插入重複記錄時遇到了非常奇怪的情況。 我正在根據特定條件檢索記錄,並且在修改了幾個屬性之後,我再次重新插入整個對象集合,甚至不更改對象的主鍵值。如何在實體框架中插入重複記錄
但我沒有得到預期的結果。嵌套在父集合中的所有集合都不會完全添加到數據庫中。
我不知道怎麼回事。我是否需要完全分離所有這些實體? 我已經使用NoTracking()檢索實體,甚至在修改它的屬性時分離父實體。
我父母收集貨物及載有兒童實體名單 「ConsignmentLine」
我的實體層次結構是:參與我的代碼
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;
});
試圖保存塊,因爲我知道,託運有> 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。
如果你將刪除這個:_dbContext.Entry(寄存).State = System.Data.Entity.EntityState.Detached; –
你是否嘗試設置ConsignmentId = 0? –
太棒了:以前我在嘗試ConsignmentId = -1,但這是完全修改和重置內部子實體(即ConsignmentLines)和ConsignmentLines重新初始化。 所以,現在我沒有費心觸摸ConsignmentId – Usman