如何使用实体框架保存对db中现有对象的引用?

时间:2014-03-23 10:52:10

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

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

我的问题是,当我保存MatchData,其中包含对db中已经有exixting的玩家的引用时,我将相同的玩家再次保存到db并因此复制它们。 (我很糟糕!)

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

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
}

玩家类持有终身特定玩家的数据(统计数据,姓名,电子邮件等):

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

的DbContext:

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();
    }
}

1 个答案:

答案 0 :(得分:0)

您需要遍历MatchData中ICollection(RedTeam,BlueTeam)的图形,并确定哪些PlayerData对象是新的(Add),已经存在(Attach),或者需要删除(Remove)。

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

注意:您也可以删除所有孩子并重新添加(如同一个链接中的其他答案所示)。代码更简单,但你的sql开销可能要高得多。