Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架在数据库中保存对现有对象的引用?_C#_Entity Framework 4_Ef Code First - Fatal编程技术网

C# 如何使用实体框架在数据库中保存对现有对象的引用?

C# 如何使用实体框架在数据库中保存对现有对象的引用?,c#,entity-framework-4,ef-code-first,C#,Entity Framework 4,Ef Code First,我正在制作一个记录程序,记录游戏中的数据。 我有一个独特的球员数据库。在一个新游戏中,我加载玩家,并将他们与PlayerData类型的数据集相关联,在回合结束时将其保存到db中 我的问题是,当我保存MatchData(其中包含对db中已经存在的播放器的引用)时,我会将相同的播放器再次保存到db中,从而复制它们。我觉得很糟糕 实体框架不能只保存对数据库中已经存在的播放器的引用吗?如果,如何?如果没有,你们有没有关于这个问题的讨论 MatchData类保存特定匹配的数据: public class

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

我的问题是,当我保存MatchData(其中包含对db中已经存在的播放器的引用)时,我会将相同的播放器再次保存到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
}
玩家类保存特定玩家的生命统计、姓名、电子邮件等数据:

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