c# - Entity Framework - 子模型的 "cannot insert duplicate object"

标签 c# .net entity-framework

我确信有一个非常简单的解决方案。使用 EntityFramework,给定这三个模型:

public class Player {
    public string Id {get; set;}
    public string Name {get; set;}
    public Team Team {get; set;}
}

public class Team {
    public string Id {get; set;}
    public string Name {get; set;}
}

public class Sponsor {
   public string Id {get; set;}
   public Player Representative {get; set;}
}

以及上下文中对应的集合:

    public DbSet<Player> Players { get; set; }
    public DbSet<Team> Teams { get; set; }
    public DbSet<Sponsor> Sponsors { get; set; }

在团队已经存在的情况下添加新玩家时会出现问题。

只有添加一个新的播放器才能正常工作:

  // player is a new Player
  using (var db = new MyContext())
  {
       db.Players.AddOrUpdate(player);
       db.SaveChanges();
  }

但尝试更改现有赞助商的代表属性失败:

using (var db = new MyContext())
{
     var sponsor = db.Sponsors.Single(s => s.Id == 1);
     sponsor.Representative = player;
     db.SaveChanges();
}

失败并出现错误:

{“违反主键约束‘PK_dbo.Teams’。无法在对象‘dbo.Teams’中插入重复键。”

我不希望它复制团队条目。

最佳答案

这是由于 known bugAddOrUpdate 中。解决方法是将 player 引用替换为 EF 实际跟踪的对象:

using (var db = new MyContext())
{
     db.Players.AddOrUpdate(player);
     db.SaveChanges();

     // Get the actually tracked player:
     player = db.Players.Local.Single(p => p.Id == player.Id);
}

在您当前的代码中,当您执行...

sponsor.Representative = player;

... EF“认为”您正在添加一个新播放器,因为它不跟踪 player 所指的对象。

关于c# - Entity Framework - 子模型的 "cannot insert duplicate object",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34853156/

相关文章:

entity-framework - EF Core 可为空关系设置删除 : ReferentialAction. 限制

c# - MVC4 WebApi 进程启动器

.net - MSBuild 在指定绝对路径时复制依赖项,在相对路径时忽略

.net - .NET 应用程序的插件设计

c# - 检查 Oracle.DataAccess 是否存在

c# - 是否可以在低于 6 的 EF 版本中拦截来自 EF 的 DB 查询?

c# - EntityFramework ComplexType 引用 EntityType

c# - iTextSharp PDF 打印

c# - Moq 定义严格的模拟

c# - .NET/VB6 应用程序在 Windows 7 上失败