更新m-to-m关系,复制主键

时间:2015-11-30 07:51:02

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

我正在尝试更新与ListBox的m-to-m关系。我的实体模型如下所示:

enter image description here

我有一个带有复选框的ListBox,用户可以决定哪个Player在联盟中,哪个不在(IsSelected-Property)。有两个问题:首先我无法检查然后取消选中播放器(它不会被删除)。第二个问题:第一次尝试,一切正常,当我再次进行选择时,我得到以下异常:

  
      
  • _innerException {"更新条目时发生错误。有关详细信息,请参阅内部异常。"} System.Exception {System.Data.Entity.Core.UpdateException}
  •   
  • _innerException {"违反PRIMARY KEY约束' PLID'。无法在对象' dbo.PlayerLeague'中插入重复的密钥。重复键值为(2,2)。\ r \ n语句已终止。"} System.Exception {System.Data.SqlClient.SqlException}
  •   
using (BettingLeagueEntities entities = new BettingLeagueEntities())
{
    foreach (PlayerCheckBoxList p in this.PlayerList)
    {
        if(p.IsSelected == true)
        {
            PlayerLeague pl = new PlayerLeague();
            pl.League = this.ActiveLeague;
            pl.Player = p.ActivePlayer;

            var local = entities.Set<Player>().Local.FirstOrDefault(x => x.PID == p.ActivePlayer.PID);
            if(local != null)
            {
                entities.Entry(local).State = System.Data.Entity.EntityState.Detached;
            }

            var localLeague = entities.Set<League>().Local.FirstOrDefault(x => x.LID == this.ActiveLeague.LID);
            if (localLeague != null)
            {
                entities.Entry(localLeague).State = System.Data.Entity.EntityState.Detached;
            }

            if (entities.Entry(p.ActivePlayer).State == System.Data.Entity.EntityState.Detached)
            {
                entities.Player.Add(p.ActivePlayer);
                entities.Entry(p.ActivePlayer).State = System.Data.Entity.EntityState.Modified;
            }
            if (entities.Entry(this.ActiveLeague).State == System.Data.Entity.EntityState.Detached)
            {
                entities.League.Add(this.ActiveLeague);
                entities.Entry(this.ActiveLeague).State = System.Data.Entity.EntityState.Modified;
            }

            if(p.ActivePlayer.PlayerLeague.All(x => x.LID != this.ActiveLeague.LID))
            {
                p.ActivePlayer.PlayerLeague.Add(pl);
                this.ActiveLeague.PlayerLeague.Add(pl);
            }
        }
        else
        {
            PlayerLeague local = entities.Set<PlayerLeague>().Local.FirstOrDefault(x => x.LID == this.ActiveLeague.LID && x.PID == p.ActivePlayer.PID);
            if(local != null)
            {
                entities.PlayerLeague.Attach(local);
                entities.PlayerLeague.Remove(local);
            }

            entities.SaveChanges();
        }
    }
    entities.SaveChanges();
}

我不知道如何解决这个问题,你有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我拥有它!我试着稍微评论一下,让它变得可以理解。

第一个问题是我检查了我的PlayerLeague是否已经存在太晚了。我在第一个if(声明)中移动了这个条件。

第二个错误是,在我的else块中,我发现找到一个玩家联盟的声明返回了alsways null。现在我检查是否有任何实体,如果这是真的,我删除它。

using (BettingLeagueEntities entities = new BettingLeagueEntities())
{
    foreach (PlayerCheckBoxList p in this.PlayerList)
    {
        // Check if the Player is seleceted and if the ActivePlayer has the Active League
        if (p.IsSelected == true && p.ActivePlayer.PlayerLeague.All(x => x.LID != this.ActiveLeague.LID))
        {
            // Define the new PlayerLeague
            PlayerLeague pl = new PlayerLeague {PID = p.ActivePlayer.PID, LID = this.ActiveLeague.LID};

            var localPlayer = entities.Set<Player>().Local.FirstOrDefault(x => x.PID == p.ActivePlayer.PID);

            if (localPlayer != null)
            {
                entities.Entry(localPlayer).State = System.Data.Entity.EntityState.Detached;
            }

            if (entities.Entry(p.ActivePlayer).State == System.Data.Entity.EntityState.Detached)
            {
                entities.Player.Add(p.ActivePlayer);
                entities.Entry(p.ActivePlayer).State = System.Data.Entity.EntityState.Modified;
            }

            var localLeague = entities.Set<League>().Local.FirstOrDefault(x => x.LID == this.ActiveLeague.LID);

            if (localLeague != null)
            {
                entities.Entry(localLeague).State = System.Data.Entity.EntityState.Detached;
            }

            if (entities.Entry(this.ActiveLeague).State == System.Data.Entity.EntityState.Detached)
            {
                entities.League.Add(this.ActiveLeague);
                entities.Entry(this.ActiveLeague).State = System.Data.Entity.EntityState.Modified;
            }

            p.ActivePlayer.PlayerLeague.Add(pl);
            this.ActiveLeague.PlayerLeague.Add(pl);
        }
        else
        {
            // Check if there is a PlayerLeague for this Player and league
            bool hasPlayerLeague =
                entities.PlayerLeague.Any(x => x.LID == this.ActiveLeague.LID && x.PID == p.ActivePlayer.PID);

            if (hasPlayerLeague && p.IsSelected == false)
            {
                // Find PlayerLeague
                PlayerLeague pl =
                        entities.PlayerLeague.FirstOrDefault(
                        x => x.LID == this.ActiveLeague.LID && x.PID == p.ActivePlayer.PID);

                // Attach and Remove PlayerLeague
                entities.PlayerLeague.Attach(pl);
                entities.PlayerLeague.Remove(pl);
            }

            entities.SaveChanges();
        }
    }
}