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 5 (MVC 6) 中使用实体框架 6.x
如何为 Asp.NET MVC 5 创建 ClaimsIdentity 对象?