我正在做一个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=107936
的Promotions
时,它抛出了contraint violation
异常......女巫是对的...
但是当它用Cam_id =107937
读取下一条Promotions
记录时.该记录在 PromocionAddresId 表中没有记录,因此必须插入它,但它抛出了相同的错误异常...
看来await dbDestino.SaveChangesAsync();
仍然拥有所有记录,或者它仍然存在于某个地方......
我试过添加
dbDestino.Promocions.Remove(pp);
在catch exception
里面,但它没有用。
我不知道如何解决它。
有什么想法吗?
谢谢
您为循环的所有迭代创建了数据上下文的单个实例。添加到上下文中的所有对象都将驻留在那里,直到上下文被释放或清除。您观察到的情况是:
- 添加第一个实体
- 尝试保存更改,但由于违反约束而失败
- 添加了第二个实体
- 保存更改的另一种尝试。在这里,将尝试插入第一个和第二个实体,因为它们仍然属于数据上下文。
另请注意,在每个实体之后调用"保存更改"通常效率不高。最好插入一部分实体(假设 100 个)并将其保留在一个镜头中。