【问题标题】:Entity Framework many to many relationship insert实体框架多对多关系插入
【发布时间】:2014-11-11 14:30:21
【问题描述】:

我有一个带有实体框架 6 的 Web API 应用程序。 我有 2 个实体 - Player 和 Match,它们之间存在多对多关系:

 public class Player {
    public string PlayerId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Match> Matches { get; set; }

}
 public class Match {
    public string MatchId { get; set; }
    public DateTime DateTime { get; set; }
    public virtual ICollection<Player> Players { get; set; }
}

这就是我的 DBContext 的样子:

public class FIFA15RankingContext : DbContext {
    public DbSet<Player> Players { get; set; }
    public DbSet<Match> Matches { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<Player>()
            .HasMany(t => t.Matches)
            .WithMany(t => t.Players)
            .Map(m => {
                m.ToTable("PlayerMatches");
                m.MapLeftKey("PlayerId");
                m.MapRightKey("MatchId");
            }
            );
        base.OnModelCreating(modelBuilder);
    }
}   

EF 在幕后为我创建了表格 PlayerMatches (PlayerId, MatchId)。

这是我的 MatchesController(由 VS 2013 搭建):

    // POST: api/Matches
    [ResponseType(typeof(Match))]
    public async Task<IHttpActionResult> PostMatch(Match match)
    {
        if (!ModelState.IsValid)
           return BadRequest(ModelState);

        db.Matches.Add(match);

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateException)
        {
            if (MatchExists(match.MatchId))
               return Conflict();

            else
               throw;               
        }

        return CreatedAtRoute("DefaultApi", new { id = match.MatchId }, match);
    }

我希望能够创建新匹配并与现有用户关联。 我无法让它以任何其他方式工作,只能在 db.Matches.Add(match) 之前添加这段代码(闻起来很糟糕):

        var playersFromDB = new List<Player>();
        if (match.Players != null) {
            foreach (var p in match.Players) {
                playersFromDB.Add(db.Players.Find(p.PlayerId));
            }
        }
        match.Players = playersFromDB;

我做错了什么?

【问题讨论】:

  • 只有现有玩家从表格中获得收入吗?
  • 是的,只有现有用户,在数据库中播种。

标签: c# entity-framework entity-framework-6


【解决方案1】:

如果数据库中已经存在所有玩家,您可以将它们附加到 dbcontext 而不是从 db 加载。

    if (match.Players != null) {
        foreach (var player in match.Players) {
            db.Players.Attach(player);
        }
    }

【讨论】:

    【解决方案2】:

    手动附加User实体并将其状态设置为Unchanged

    foreach( var p in match.Players )
    {
        db.Entry( p ).State = EntityState.Unchanged;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多