我使用实体框架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图时,您指向正确的数据库,在我的情况下,连接字符串指向一个本地DB,而不是最新的Dev DB,我知道,学生错误,但我想发布这个,因为它可以非常令人沮丧,如果你确信你已经添加了主键,你仍然得到相同的错误

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

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

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

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

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

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

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