我在 Entity Framework 中保存数据时遇到问题。
我已经完成了一个覆盖我的 dbContext 的 saveChanges 的函数,因为我用它来设置一些审计数据和做其他事情。在一个案例中,我遇到了一个大麻烦。
我必须为每条新记录插入另一个表中的一些记录,用外键引用新记录。如果新记录只有一个,那一切都可以。但是如果记录是 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,但我得到了相同的结果。
我怎样才能达到我的目标?
最佳答案
从这个问题的评论中Ben Robinson的暗示开始,我找到了解决办法。
它有效,但它仍然是“完美的解决方案”,因为要做到这一点,我不得不评论批量插入的部分,所以它有很多新记录有点慢。
无论如何,我在问题中发布的代码现在是:
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 实现我的目标,请告诉我!
关于c# - Entity Framework - 保存引用新记录的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27599223/