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

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

var roomDetails = context.Rooms.ToList();

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

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

 context.SaveChanges();

我得到了错误:

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

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

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


当前回答

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

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

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

重新开始工作。

其他回答

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

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

只需添加一个主键到您的表,然后重新创建您的EF

我有这个问题出现,并相信这是因为我删除了我的表主键上的索引,并将其替换为表中其他一些字段的索引。

在我删除主键索引并刷新edmx后,插入停止工作。

我将表刷新到旧版本,刷新edmx,一切都重新工作了。

我应该指出,当我打开EDMX来解决这个问题时,检查是否定义了一个主键,结果是存在的。所以上面的建议对我都没有帮助。但是刷新主键上的索引似乎有用。

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

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

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

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