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 Promocions
的 Origen
数据库中搜索,然后将这些记录插入 Destino 数据库中的 Promotions table 中。
我包括一个名为 PromocionAddresIds
的 child table 也被迁移了。
一切正常...
table PromocionAddresIds
有一个约束 table 它没有被迁移。
当我插入带有 cam_id=107936
的 Promotions
时,它抛出了异常 contraint violation
... 是正确的...
但是当它用 Cam_id =107937
读取下一个 Promotions
记录时。那条记录在table PromocionAddresIds中没有记录,所以必须插入,但是它抛出了同样的错误异常...
似乎 await dbDestino.SaveChangesAsync();
仍然有所有记录或它在某处保留...
我试过添加
dbDestino.Promocions.Remove(pp);
里面的catch exception
,但是没用。
我不知道如何解决它。
有什么想法吗?
谢谢
您为循环的所有迭代创建了一个数据上下文实例。添加到上下文中的所有对象都将存在,直到上下文被释放或清除。您观察到的情况是:
- 添加了第一个实体
- 尝试保存更改,但由于违反约束而失败
- 添加了第二个实体
- 再次尝试保存更改。这里将尝试插入第一个和第二个实体,因为它们仍然属于数据上下文。
另请注意,在每个实体之后调用 "save changes" 通常效率不高。最好插入一部分实体(假设 100 个)并一次性持久化它。
我正在做 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 Promocions
的 Origen
数据库中搜索,然后将这些记录插入 Destino 数据库中的 Promotions table 中。
我包括一个名为 PromocionAddresIds
的 child table 也被迁移了。
一切正常...
table PromocionAddresIds
有一个约束 table 它没有被迁移。
当我插入带有 cam_id=107936
的 Promotions
时,它抛出了异常 contraint violation
... 是正确的...
但是当它用 Cam_id =107937
读取下一个 Promotions
记录时。那条记录在table PromocionAddresIds中没有记录,所以必须插入,但是它抛出了同样的错误异常...
似乎 await dbDestino.SaveChangesAsync();
仍然有所有记录或它在某处保留...
我试过添加
dbDestino.Promocions.Remove(pp);
里面的catch exception
,但是没用。
我不知道如何解决它。
有什么想法吗?
谢谢
您为循环的所有迭代创建了一个数据上下文实例。添加到上下文中的所有对象都将存在,直到上下文被释放或清除。您观察到的情况是:
- 添加了第一个实体
- 尝试保存更改,但由于违反约束而失败
- 添加了第二个实体
- 再次尝试保存更改。这里将尝试插入第一个和第二个实体,因为它们仍然属于数据上下文。
另请注意,在每个实体之后调用 "save changes" 通常效率不高。最好插入一部分实体(假设 100 个)并一次性持久化它。