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

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

var roomDetails = context.Rooms.ToList();

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

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

 context.SaveChanges();

我得到了错误:

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

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

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


当前回答

如果你的表没有主键,这个错误可能已经发生,在这种情况下,表是“只读”的,而db。SaveChanges()命令将始终出错。

其他回答

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

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

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

我通过删除和重建EF项目及其所有类来修复它。详情如下:

我在这个问题上转了一个小时,然后删除了包含错误的EF项目,保存了我所有的自定义代码,然后重新构建整个东西。由于这只是生成一个新的EF图及其内部代码的问题,这个修复问题的过程大约花了10分钟。

我怀疑,问题在于生成EF类和属性的数据库优先方法在两次或三次“更新”后变得有点奇怪。基本上,我在代码行为中发现了一个问题,去修复数据库表属性,然后更新EF图一次太多。然后我试着修改代码,但没有用。

重新开始工作。

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

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

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

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

我也有同样的问题。正如这个帖子所说,我的表没有PK,所以我设置了PK并运行代码。但不幸的是,错误又来了。我接下来做的是,删除数据库连接(删除解决方案资源管理器的模型文件夹中的。edmx文件)并重新创建它。错误消失了。谢谢大家分享你的经验。这样可以节省很多时间。