gpt4 book ai didi

c# - Entity Framework - 保存引用新记录的外键

转载 作者:行者123 更新时间:2023-11-30 18:26:59 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com