【发布时间】: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