c# entity framework 循环遍历记录 savechanges() 错误

c# entity framework loop through records savechanges() error

我正在做 C# Entity Framework 申请。

我正在将两个 table 中的数据从一个数据库迁移到另一个数据库。那些 table 被同名调用。

这是我的代码

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();
    }
 }
它在这里做的是:

我在 table PromocionsOrigen 数据库中搜索,然后将这些记录插入 Destino 数据库中的 Promotions table 中。

我包括一个名为 PromocionAddresIds 的 child table 也被迁移了。

一切正常...

table PromocionAddresIds 有一个约束 table 它没有被迁移。

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

但是当它用 Cam_id =107937 读取下一个 Promotions 记录时。那条记录在table PromocionAddresIds中没有记录,所以必须插入,但是它抛出了同样的错误异常...

似乎 await dbDestino.SaveChangesAsync(); 仍然有所有记录或它在某处保留...

我试过添加

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

我不知道如何解决它。

有什么想法吗?

谢谢

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

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

另请注意,在每个实体之后调用 "save changes" 通常效率不高。最好插入一部分实体(假设 100 个)并一次性持久化它。