我确信有一个非常简单的解决方案。使用 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 bug在 AddOrUpdate
中。解决方法是将 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/