我正在制作一个记录游戏统计数据的记录程序。 我有一个独特的玩家数据库。在新游戏中,我加载玩家并将它们与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();
}
}
答案 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开销可能要高得多。