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

本文关键字:引用 对象 框架 实体 何保存 保存 数据库 | 更新日期: 2023-09-27 17:52:46

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

我的问题是,当我保存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
}

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
}

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

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

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

查看此处批准的答案:不能更改关系,因为一个或多个外键属性不可为空

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