实体框架 - 保存引用新记录的外键

本文关键字:新记录 引用 框架 保存 实体 | 更新日期: 2023-09-27 18:34:51

我在实体框架中保存数据时遇到问题。

我已经完成了一个覆盖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(我也尝试过没有批量插入,但我得到了相同的结果。

如何实现目标?

实体框架 - 保存引用新记录的外键

从本·罗宾逊在这个问题的评论中的暗示开始,我找到了解决方案。

它可以工作,但它是"完美的解决方案",因为要做到这一点,我不得不评论批量插入的部分,所以很多新记录有点慢。

无论如何,我在问题中发布的代码现在是:

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);
}

如果您知道如何使用批量插入来实现我的目标,请告诉我!