C# 如何使用实体框架在数据库中保存对现有对象的引用?
我正在制作一个记录程序,记录游戏中的数据。 我有一个独特的球员数据库。在一个新游戏中,我加载玩家,并将他们与PlayerData类型的数据集相关联,在回合结束时将其保存到db中 我的问题是,当我保存MatchData(其中包含对db中已经存在的播放器的引用)时,我会将相同的播放器再次保存到db中,从而复制它们。我觉得很糟糕 实体框架不能只保存对数据库中已经存在的播放器的引用吗?如果,如何?如果没有,你们有没有关于这个问题的讨论 MatchData类保存特定匹配的数据:C# 如何使用实体框架在数据库中保存对现有对象的引用?,c#,entity-framework-4,ef-code-first,C#,Entity Framework 4,Ef Code First,我正在制作一个记录程序,记录游戏中的数据。 我有一个独特的球员数据库。在一个新游戏中,我加载玩家,并将他们与PlayerData类型的数据集相关联,在回合结束时将其保存到db中 我的问题是,当我保存MatchData(其中包含对db中已经存在的播放器的引用)时,我会将相同的播放器再次保存到db中,从而复制它们。我觉得很糟糕 实体框架不能只保存对数据库中已经存在的播放器的引用吗?如果,如何?如果没有,你们有没有关于这个问题的讨论 MatchData类保存特定匹配的数据: public class
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
}
玩家类保存特定玩家的生命统计、姓名、电子邮件等数据:
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中浏览ICollection RedTeam和BlueTeam的图形,并确定哪些PlayerData对象是新添加的、已存在的、附加的或需要删除的 请参见此处批准的答案:
注意:您还可以删除所有子项并将其作为同一链接中的其他答案重新添加。代码要简单得多,但sql开销可能要高得多。EF的哪个版本?您的DbContext看起来像什么-特别是您的数据库集和关系?你能发布一段你保存MatchData的地方吗?player类有严重的问题,因为只有私有字段而没有公共属性。Wiktor Zychla:这只是一个小问题。。我不想发布所有代码。别想了。。迈克尔·芬格:我刚刚为你更新了这个问题。如果您需要更多信息,请告诉我。如果您处于开发阶段,为什么不升级到EF最新版本?只是好奇。显然,PlayerData。当你保存数据时,播放器被加载了。尽量避免这种情况。通过db.MatchData.AddmatchData,MatchData包含的所有内容都标记为已添加。我的所有播放器都在数据库中。当程序启动时,它将从db加载所有播放器。我只想保存一个新对象,其中包含对这些玩家的引用。
class DBBooneContext : DbContext
{
public DbSet<Player> Player { get; set; }
public DbSet<PlayerData> PlayerData { get; set; }
public DbSet<MatchData> MatchData { get; set; }
}
public static void SaveMatchData(MatchData matchData)
{
using (DBBooneContext db = new DBBooneContext())
{
db.MatchData.Add(matchData);
db.SaveChanges();
}
}