Asp.net 如何使用实体框架删除一对多的对象

Posted

技术标签:

【中文标题】Asp.net 如何使用实体框架删除一对多的对象【英文标题】:Asp.net How do i delete objects with One To Many using entity framework 【发布时间】: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 【参考方案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 会是一样的?? 你能解释一下我截图的外键是怎么做的,以防我做错了

以上是关于Asp.net 如何使用实体框架删除一对多的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET MVC 中的数据库中删除对象?

如何在 Asp.Net 5 (MVC 6) 中使用实体框架 6.x

ASP.NET EF实体主外键关系

如何为 Asp.NET MVC 5 创建 ClaimsIdentity 对象?

iOS核心数据如何使用NSPredicate根据一对多的子属性查找父对象?

删除与基于视图的实体具有一对多关联的实体对象