在相同的函数中创建然后更新会导致异常“ {id}的相同键值已被跟踪”

时间:2019-07-01 16:05:54

标签: c# .net-core entity-framework-core npgsql

使用.NET Core 2.1,Entity Framework Core和NPGSQL。

我创建了一条新记录:

await _context.music.AddAsync(song);
await _context.SaveChangesAsync();

然后,在相同函数中,我进行了一些计算(创建时无法执行),然后调用Update(仅更新了Comments字段):

_context.music.Update(song);
await _context.SaveChangesAsync();

这是“歌曲”的类别:

public class Song
{
    [Key]
    public int SongId { get; set; }
    public int Title{ get; set; }
    public string Comments{ get; set; }

    //Navigation Properties
    public virtual ICollection<Foo> Foos { get; set; }        
}

在我的MusicContext中:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ForNpgsqlUseIdentityColumns();

    modelBuilder.Entity<Foo>()
        .HasOne(m => m.Song)
        .WithMany(r => r.Foos)
        .HasForeignKey(m => m.SongId);
}

这是我得到的例外:

  

System.AggregateException:发生一个或多个错误。 (一个或多个   发生错误。 (实体类型“ Song”的实例不能为   跟踪,因为另一个实例具有相同的键值   {'SongId'}已被跟踪。附加现有时   实体,请确保只有一个具有给定键值的实体实例   被附上。考虑使用   'DbContextOptionsBuilder.EnableSensitiveDataLogging'以查看   冲突的键值。))---> System.AggregateException:一个或多个   发生错误。

有人有什么想法吗? :-/

1 个答案:

答案 0 :(得分:0)

我会重新考虑您的方法。如果您使用相同的方法进行添加然后进行更新,则只需在底部进行添加,包括计算中的注释值即可。