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

时间:2014-12-22 08:42:37

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

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

我已经完成了一个覆盖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,但我得到了相同的结果。

我如何实现目标?

1 个答案:

答案 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实现我的目标,请告诉我们。