我在实体框架中保存数据时遇到问题。
我已经完成了一个覆盖dbContext的saveChanges的函数,因为我用它来设置一些审计数据并做其他事情。在一个案例中,我遇到了很大麻烦。
我必须为每个新记录插入另一个表中的一些记录,并使用外键引用new。如果新记录只有一个,那就没关系了。但如果记录是2或更多,我会得到错误。
我有一个for,以这种方式循环所有新记录:
var addedAuditedEntities = ChangeTracker.Entries()
.Where(p => p.State == EntityState.Added)
.Select(p => p.Entity);
foreach (var added in addedAuditedEntities)
{
.....
}
我写下我的尝试。
1)通过这种方式,它在第二个新记录中给出了错误,说TabAssVeicoliTerminali选项卡中已经有一个唯一的数据(这是一对IDTER-IDTEV夫妇的唯一索引表),我想是因为它会插入IDTEV = 0的临时所有记录
else if (added.GetType() == typeof(TabTessereVeicoli))
{
TabTessereVeicoli i = (TabTessereVeicoli)added;
i.DATA_INS = now;
i.USER_INS = mdlImpostazioni.p.UserName;
var listaterV = new List<TabAssVeicoliTerminali>();
foreach (var ter in MainWindow.dbContext.TabTerminali)
{
var tt = new TabAssVeicoliTerminali();
tt.MODIFICATO = true;
tt.ABILITATO = true;
tt.IDTER = ter.ID;
tt.IDTEV = i.ID;
tt.DATA_INS = now;
tt.USER_INS = mdlImpostazioni.p.UserName;
listaterV.Add(tt);
}
MainWindow.dbContext.BulkInsert(listaterV);
}
2)所以,我之前尝试保存,尝试设置新记录的ID(它是自动增量id)并在IDTEV外键中使用!= 0。但是,它保存了所有,也保存了其他新记录。因此,它正确地将fk保存在其他表中,但仅用于第一个新记录:
else if (added.GetType() == typeof(TabTessereVeicoli))
{
TabTessereVeicoli i = (TabTessereVeicoli)added;
i.DATA_INS = now;
i.USER_INS = mdlImpostazioni.p.UserName;
var listaterV = new List<TabAssVeicoliTerminali>();
base.SaveChanges();
foreach (var ter in MainWindow.dbContext.TabTerminali)
{
var tt = new TabAssVeicoliTerminali();
tt.MODIFICATO = true;
tt.ABILITATO = true;
tt.IDTER = ter.ID;
tt.IDTEV = i.ID;
tt.DATA_INS = now;
tt.USER_INS = mdlImpostazioni.p.UserName;
listaterV.Add(tt);
}
MainWindow.dbContext.BulkInsert(listaterV);
}
3)我也试过没有BulkInsert,但我得到了相同的结果。
我如何实现目标?
答案 0 :(得分:0)
从Ben Robinson在这个问题的评论中提示,我找到了一个解决方案。
它有效,但它是完美的解决方案&#34;,因为要做到这一点,我不得不评论批量插入的部分,所以它有点慢,有很多新的记录。
无论如何,我在问题中发布的代码现在是:
else if (added.GetType() == typeof(TabTessereVeicoli))
{
TabTessereVeicoli i = (TabTessereVeicoli)added;
i.DATA_INS = now;
i.USER_INS = mdlImpostazioni.p.UserName;
var listaterV = new List<TabAssVeicoliTerminali>();
foreach (var ter in MainWindow.dbContext.TabTerminali)
{
var tt = new TabAssVeicoliTerminali();
tt.MODIFICATO = true;
tt.ABILITATO = true;
tt.IDTER = ter.ID;
tt.IDTEV = i.ID;
tt.DATA_INS = now;
tt.USER_INS = mdlImpostazioni.p.UserName;
//listaterV.Add(tt);
i.TabAssVeicoliTerminali.Add(tt);
}
//MainWindow.dbContext.BulkInsert(listaterV);
}
如果您知道如何使用bulkInsert实现我的目标,请告诉我们。