实体框架将现有数据库和模型中的一对多映射

时间:2018-04-03 20:33:31

标签: entity-framework

我一直在尝试使用Entity Framework更新我的项目。我有一个现有的数据库和模型,经过一些工作匹配。通过更多工作,我设法让应用程序成功读取数据库中的数据。但是在保存新数据时,噩梦就开始了。

在我的数据结构中,我有两个一对多的关系,一个在玩家和团队之间,一个在匹配和团队之间。我一直在尝试许多配置(使用[Key],外键,反属性属性)但我得到一个错误

  

尝试将List转换为团队

  

找不到任何列Match_id没有找到列Player_id

这是我的代码:

public class Match
{
    //[Key]
    //[DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string Id { get; set; }
    //[Column("Date")]
    public DateTime Date { get; set; }

    public DateTime EndTime { get; set; }
    [NotMapped]
    public bool Remove { get; set; }

    //[InverseProperty("Match")]
    [ForeignKey("MatchId")]
    public virtual ICollection<Team> Teams { get; set; }

    public int WinningTeamId { get; set; }

    public MatchType MatchType { get; set; }
    public string Source { get; internal set; }

    public Match()
    {
        WinningTeamId = -1;
        this.Teams = new List<Team>();
        this.EndTime = (DateTime)SqlDateTime.MinValue;
    }
}

public class Team
{
    public int TeamId { get; set; }

    [NotMapped]
    public int RatingChange { get; set; } 

    [Key()]
    [Column("PlayerId", Order = 2)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public virtual Player Player { get; set; }

    [Column(Order = 1)]
    [Key()]
    //[DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string MatchId { get; set; }

    [ForeignKey("MatchId")]
    public virtual Match Match { get; set; }

    [NotMapped]
    public int Rating { get; set; }

    public Team()
    {
    }
}

public class Player
{
    public string name { get; set; }
    public int PastatsId { get; set; }
    public string UberId { get; set; }

    //[ForeignKey("PlayerId")]
    //[InverseProperty("Player")]
    public virtual ICollection<Team> Teams { get; set; }

    //[Key()]
    public int Id { get; set; }
}

要保存新的比赛,我首先保存球员以防止发生冲突:

public void Save(IEnumerable<Match> matches)
{
        foreach (var match in matches)
        {
            foreach (var team in match.Teams)
            {
                var entry = Entry(team.Player);

                if (entry.State == EntityState.Detached)
                {
                    var localplayer = Players.Local.FirstOrDefault(x => x.UberId == team.Player.UberId);

                    if (localplayer == null)
                    {
                        this.Players.Add(team.Player);
                        team.Player = entry.Entity;
                    }
                    else
                    {
                        team.Player = localplayer;
                    }
                }
                else
                {
                    Entry(team.Player).State = EntityState.Modified;
                }
            }
        }

        SaveChanges();

        foreach (var match in matches)
        {
            if (Matches.Find(match.Id) != null)
            {
                continue;
            }

            if (Entry(match).State == EntityState.Detached)
            {
                this.Matches.Add(match);
            }
        }

        SaveChanges();
}

如何使用现有数据库和代码进行映射?

非常感谢任何见解。

0 个答案:

没有答案