【问题标题】:How to save a reference to an existing object in db, using entity framework?如何使用实体框架保存对数据库中现有对象的引用?
【发布时间】:2014-04-30 15:45:55
【问题描述】:

我正在制作一个记录游戏统计数据的记录程序。 我有一个拥有独特玩家的数据库。在新游戏中,我加载玩家并将他们与 PlayerData 类型的数据集相关联,我在回合结束时将其保存到数据库中。

我的问题是,当我保存包含对数据库中已经存在的播放器的引用的 MatchData 时,我将相同的播放器再次保存到数据库并因此复制它们。 (我不好!)

实体框架不能只保存对已经在数据库中的播放器的引用吗?如果,如何?如果没有,你们有解决这个问题的办法吗?

MatchData 类保存特定匹配的数据:

public class MatchData
{
    [Key]
    public int Id { get; set; }
    private List<PlayerData> blueTeam = new List<PlayerData>();
    private List<PlayerData> redTeam = new List<PlayerData>();
    //other relevant data
}

PlayerData 类保存比赛中特定球员的数据:

public class PlayerData
{
    [Key]
    public int Id { get; set; }
    public Player Player { get; set; }
    //other relevant data
}

Player 类保存特定玩家终生的数据(统计数据、姓名、电子邮件等):

public class Player
{
    [Key]
    private int id;       // full props
    private string name;  // full props
    private string email; // full props
    //other relevant data
}

数据库上下文:

class DBBooneContext : DbContext
{
    public DbSet<Player> Player { get; set; }
    public DbSet<PlayerData> PlayerData { get; set; }
    public DbSet<MatchData> MatchData { get; set; }
}

这就是我如何将 matchData 保存到 db。

public static void SaveMatchData(MatchData matchData)
{
    using (DBBooneContext db = new DBBooneContext())
    {
        db.MatchData.Add(matchData);
        db.SaveChanges();
    }
}

【问题讨论】:

  • 什么版本的 EF?您的 DbContext 是什么样的——特别是您的 DbSet 和关系?你能发布一个保存 MatchData 的位置的 sn-p 吗?
  • 播放器类存在严重问题,因为只有私有字段而不是公共属性。
  • Wiktor Zychla:它只是一个片段......不想发布所有代码。不要想它.. 它工作得很好:) Michael Finger:我刚刚为你更新了这个问题。如果您需要更多信息,请告诉我。
  • 如果您处于开发阶段,为什么不升级到最新的 EF?只是好奇。
  • 显然,PlayerData.Player 是在您保存数据时加载的。尽量防止这种情况。 db.MatchData.Add(matchData) matchData 包含的所有内容都标记为 Added

标签: c# entity-framework-4 ef-code-first


【解决方案1】:

您需要遍历 MatchData 中的 ICollection(RedTeam、BlueTeam)图表,并确定哪些 PlayerData 对象是新的(添加)、已经存在(附加)或需要删除(删除)。

在此处查看批准的答案:The relationship could not be changed because one or more of the foreign-key properties is non-nullable

注意:您还可以删除所有孩子并重新添加它们(如同一链接中的其他答案所示)。代码简单多了,但是你的sql开销可能会高很多。

【讨论】:

  • 我的所有玩家都在数据库中。当程序启动时,它会从数据库加载所有播放器。我只想保存一个包含对这些玩家的引用的新对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多