2013-03-20 83 views
2

我正在使用实体框架5,并试图删除一个没有主键的实体。我的意思是我的表甚至没有主键。无密钥的实体框架删除

场景如下:

我有3个表,其具有以下流程:

MainTeam - > UserPerTeam < - 用户

我Mainteam表已经主键ID是相对于与表UserPerTeam中的MainTeamID。

我的用户表具有与表UserPerTeam中的UserID相关的主键ID。

UserPerTeam有这2个关系和该表中所需的其他字段。

所以现在当我使用下面的代码,我的实体框架破坏的事实是,它没有一个主键:

var upt = new FighterPerTeam { UserID = userId, TeamID = teamId }; 
Entities.UserPerTeam.Attach(upt); 
Entities.UserPerTeam.Remove(upt); 
Entities.SaveChanges(); 

所以现在我得到的全能错误:

无法更新EntitySet'UserPerTeam',因为它具有DefiningQuery,并且元素中不存在元素以支持当前操作。

我只是想知道如何解决这是一个安全的方法。我知道我可以使用下面的代码,但我真的不喜欢使用它,因为它看起来不是实体框架。

 var cmd = ("Delete from UserPerTeam where userID = " + userId + " and teamId = " + teamId); 
     Entities.Database.ExecuteSqlCommand(cmd); 

几乎忘了提及我正在使用Lazy Loading并且我只想删除UserPerTeam表中的实体。如果您的解决方案也删除了MainTeam或User对象,那么我无法使用它。

我很欢迎所有的建议。

+1

陈述显而易见的,但你可以添加一个主要的身份密钥到你的UserPerTeam连接表(我通常会这样做)。您还可以使用流利映射将userid/teamid组合为主键。 – AaronLS 2013-03-20 22:03:21

+1

没有主键的表只能在实体框架中读取,除非存储过程映射到它们的插入,更新和删除操作。将联结表中的两列标记为数据库中的组合键。 – 2013-03-20 22:11:21

+0

谢谢@LadislavMrnka,因为这解决了我的问题。我讨厌这个事实,我需要删除我的edmx中的表,然后使用update - > add new table。只是使用更新 - >刷新仍然是打破这样的东西,我猜。你可以添加这个答案,以便我可以接受它吗? – whodares 2013-03-20 22:23:49

回答

3

没有主键的表只能在实体框架中读取,除非存储过程映射到它们的插入,更新和删除操作。将联结表中的两列标记为数据库中的组合键。