gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:38:45 25 4
gpt4 key购买 nike

我确信有一个非常简单的解决方案。使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com