【问题标题】:Asp.net How do i delete objects with One To Many using entity frameworkAsp.net 如何使用实体框架删除一对多的对象
【发布时间】:2015-11-10 13:10:42
【问题描述】:

我有以下表格球队和球员,其中每个球队有很多球员,基于 teamId 作为 guid。如您所见,团队表中第一行的 guid 为空 i 不,它只是一个测试,有两条基于球员表中的 teamID 的记录

我使用实体框架的主要问题我如何使用实体框架一次性删除团队和玩家

你可以看到第一条记录

所以在我的团队网格中,我只是在执行以下操作,但正如您所见,这只是抓取团队对象。 Obv 我可以先击中玩家对象并先删除它们。

        if (e.CommandName == "Delete")
        {

            GridDataItem item = e.Item as GridDataItem;
            Guid strId = new Guid(item.GetDataKeyValue("id").ToString());
             team  _team= _dal.GetTeamByTeamId (strId);


            _dal.SoccerEntities.teams.DeleteObject(team);


        }

这是我的 GetTeamByTeamId 函数

    public team GetTeamByTeamId(Guid  teamId)
         {
        try
        {
            if (teamId == Guid.Empty)
            {
                team _team = new team();

                return _team;
            }
            else
            {
                var q = SoccerEntities.teams.Where(p => p.id == teamId);

                if (q == null)
                    throw new EntityContextException(string.Format("A team could not be found {0}!", teamId));
                else
                    return q.ToList()[0];
            }
        }
        catch (Exception ex)
        {
            throw new EntityContextException("GetTeamByTeamId failed.", ex);
        }




    }

这是asp.net

编辑

我尝试了rankins suggesiton,但编译时出错

错误 36“soccerCmsDal.team”不包含“players”的定义,并且找不到接受“soccerCmsDal.team”类型的第一个参数的扩展方法“players”(您是否缺少 using 指令或程序集参考?) C:\new code\UniteCms\UniteCms\UniteCms\BackDoor\teams\default.aspx.cs 38 54 UniteCms

我尝试添加外键

好的,现在我设置了外键,但它不起作用,给我一个空错误

 {
            GridDataItem item = e.Item as GridDataItem;
            Guid strId = new Guid(item.GetDataKeyValue("id").ToString());
            team _team = _dal.SoccerEntities.teams.FirstOrDefault(p => p.id == strId);
            if (_team != null)
            {
                foreach (player _player in _team.players)
                {
                    _dal.SoccerEntities.players.DeleteObject(_player);
                }
                _dal.SoccerEntities.teams.DeleteObject(_team);
            }
            _dal.SoccerEntities.SaveChanges();


        }

【问题讨论】:

  • 您是否尝试过启用cascading delete? (我以为这是默认启用的)
  • @Stefan 请查看我的编辑
  • 如果@Rakin 的回答中选择的_team 包含播放器,您也可以循环收藏并一一删除。不要使用foreach,因为这可能会引发异常,说明集合已更改。 (一定有类似:_team.players

标签: c# asp.net entity-framework


【解决方案1】:
  GridDataItem item = e.Item as GridDataItem;
            Guid strId = new Guid(item.GetDataKeyValue("id").ToString());
            team _team = _dal.SoccerEntities.teams.FirstOrDefault(p => p.id == strId);
            if (_team != null)
            {

                 if( _team.players!= null &&  _team.players.Count>0)
                 { var _palayers = _team.players.ToList();
                    foreach (player _player in _palayers )
                    {
                        _dal.SoccerEntities.players.DeleteObject(_player);
                    }
                 }
                _dal.SoccerEntities.teams.DeleteObject(_team);
            }
            _dal.SoccerEntities.SaveChanges();

【讨论】:

  • 请解释一下如何为每个记录做一个有效的,如果 100 条记录会很快
  • 我也有一个错误说错误 36 'soccerCmsDal.team' 不包含'players' 的定义并且没有扩展方法'players' 接受'soccerCmsDal.team' 类型的第一个参数可能是找到(您是否缺少 using 指令或程序集引用?) C:\new code\UniteCms\UniteCms\UniteCms\BackDoor\teams\default.aspx.cs 38 54 UniteCms
  • 您是否为列 teamid 设置了外键?
  • 我试过了,但它说我不能导致 teamId 不是 unqiue 但在我的情况下 teamId 会是一样的??
  • 你能解释一下我截图的外键是怎么做的,以防我做错了
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多