C# 实体框架循环记录 savechanges() 错误



我正在做一个C# Entity Framework应用程序。

我正在将数据从一个数据库的几个表迁移到另一个数据库。这些表使用相同的名称调用。

这是我的代码

string ConnexionOrigen = ReadConnectionBiz.GetOrigen();
string ConnexionDestino = ReadConnectionBiz.GetDestino();
using (var db = new MigrateModel(ConnexionOrigen))
{
db.Configuration.LazyLoadingEnabled = false;
db.Configuration.ProxyCreationEnabled = false;
db.Configuration.AutoDetectChangesEnabled = false;
List<Promocion> promo = await (from p in db.Promocions
.Include(a =>a.PromocionAddresIds)
where (p.CAM_ID == 107936 || p.CAM_ID == 107937)
select p)
.AsNoTracking()
.ToListAsync();
var dbDestino = new MigrateModel(ConnexionDestino);
foreach (Promocion pp in promo)
{
try
{
dbDestino.Promocions.Add(pp);
await dbDestino.SaveChangesAsync();
}
catch (Exception ex)
{
string err =  ex.InnerException.InnerException.Message.ToString();
}
}
它在这里的作用是:

我从表Promocions中搜索Origen并将这些记录插入 Destino 数据库的促销表中。

我包括一个名为PromocionAddresIds的子表,它也已迁移。

每个工作正常...

PromocionAddresIds具有未迁移的表的约束。

当我插入带有cam_id=107936Promotions时,它抛出了contraint violation异常......女巫是对的...

但是当它用Cam_id =107937读取下一条Promotions记录时.该记录在 PromocionAddresId 表中没有记录,因此必须插入它,但它抛出了相同的错误异常...

看来await dbDestino.SaveChangesAsync();仍然拥有所有记录,或者它仍然存在于某个地方......

我试过添加

dbDestino.Promocions.Remove(pp);catch exception里面,但它没有用。

我不知道如何解决它。

有什么想法吗?

谢谢

您为循环的所有迭代创建了数据上下文的单个实例。添加到上下文中的所有对象都将驻留在那里,直到上下文被释放或清除。您观察到的情况是:

  1. 添加第一个实体
  2. 尝试保存更改,但由于违反约束而失败
  3. 添加了第二个实体
  4. 保存更改的另一种尝试。在这里,将尝试插入第一个和第二个实体,因为它们仍然属于数据上下文。

另请注意,在每个实体之后调用"保存更改"通常效率不高。最好插入一部分实体(假设 100 个)并将其保留在一个镜头中。

相关内容

  • 没有找到相关文章

最新更新