我使用实体框架1与。net 3.5。

我做的事情很简单,就像这样:

var roomDetails = context.Rooms.ToList();

foreach (var room in roomDetails)
{        
   room.LastUpdated = DateTime.Now;
}

当我尝试这样做时,我得到这个错误:

 context.SaveChanges();

我得到了错误:

无法更新EntitySet -因为它有一个DefiningQuery,并且<ModificationFunctionMapping>元素中没有<UpdateFunction>元素来支持当前操作。

我在上下文上做了很多更新,没有任何问题,只有当我试图更新这个特定的实体时。

我所有的搜索结果都是一样的,我要更新的实体上没有声明主键。但是,唉,我有一个主键声明…


当前回答

这就是我的情况。简单地删除会导致另一个错误。我遵循了这篇文章的步骤,除了最后一个。为了您的方便,我从文章中复制了解决问题的4个步骤,如下:

右键单击edmx文件,选择“使用XML编辑器打开” 在edmx:StorageModels元素中找到实体 完全删除DefiningQuery 将存储区:Schema="dbo"重命名为Schema="dbo"(否则,代码将生成一个错误,表示名称无效)

其他回答

它的发生通常是由于以下原因之一:

实体集从数据库视图映射 自定义数据库查询 数据库表没有主键

这样做之后,您可能仍然需要在实体框架设计器中进行更新(或者删除实体然后添加它),然后才能停止得到错误。

我得到了相同的错误消息,但在我的场景中,我试图使用PJT(纯连接表)更新从多对多关系派生的实体。

通过阅读其他帖子,我认为我可以通过在连接表中添加一个额外的PK字段来修复它……但是,如果您将PK列添加到连接表中,那么它就不再是PJT,您将失去实体框架的所有优势,例如实体之间的自动关系映射。

因此,在我的案例中,解决方案是修改DB上的连接表,使PK包含两个外部ID列。

我只需要从模型中删除表,并再次更新模型将表带回来。我猜主键是在将表拉入模型之后创建的。

如果数据模型过时,也会发生这种情况。

希望这将避免其他人的沮丧:)

只需向表中添加一个主键。就是这样。问题解决了。

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)