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

标签 c# sql-server entity-framework foreign-key-relationship savechanges

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

相关文章:

c# - 如何在 MonoTouch 中代理 UIKit 委托(delegate)?

php - 使用php备份和恢复SQL Server数据库

sql-server - 获取 SQL Server 临时表列类型

sql - FromSqlRaw注入(inject)EF Core 3.0

c# - 通过存储过程将上传的文件(InputStream)保存到SQL Server

c# - 编译库而不检查引用

c# - Azure 函数 : Client was not authenticated to send anonymous mail during MAIL FROM [DB6P189CA0021. EURP189.PROD.OUTLOOK.COM]

c# - 统一: Enemy Generation Code

sql-server - vs2015 SSD : publish could not drop table from db (deleted from package)

c# - Entity Framework - 使用外键插入