【问题标题】:Entity framework delete without key实体框架删除无键
【发布时间】:2013-03-20 21:57:50
【问题描述】:

我正在使用 Entity Framework 5,我正在尝试删除一个没有主键的实体。我的意思是我的表甚至没有主键。

场景如下:

我有 3 个表,它们的流程如下:

MainTeam -> UserPerTeam

我的 Mainteam 表的主键 ID 与表 UserPerTeam 中的 MainTeamID 相关。

My User 表的主键 ID 与表 UserPerTeam 中的 UserID 相关。

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);

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

我欢迎所有建议。

【问题讨论】:

  • 显而易见,但您可以将主标识键添加到 UserPerTeam 连接表中(我通常会这样做)。您还可以使用流利的映射将 userid/teamid 设为复合主键。
  • 没有主键的表在实体框架中是只读的,除非存储过程映射到它们的插入、更新和删除操作。将联结表中的两列标记为数据库中的复合键。
  • 谢谢@LadislavMrnka,因为它为我解决了问题。我确实讨厌我需要删除我的 edmx 中的表,然后使用更新 -> 添加新表的事实。当涉及到这样的事情时,我猜只是使用更新->刷新仍然会被破坏。您可以将此添加为答案以便我接受吗?

标签: .net linq entity-framework


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多