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

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

var roomDetails = context.Rooms.ToList();

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

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

 context.SaveChanges();

我得到了错误:

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

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

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


当前回答

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

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

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

其他回答

这不是一个新的答案,但将帮助那些不知道如何设置表的主键的人。在一个新的查询中使用它并运行。这将把UniqueID列设置为主键。

USE [YourDatabaseName]
GO

Alter table  [dbo].[YourTableNname]
Add Constraint PK_YourTableName_UniqueID Primary Key Clustered (UniqueID);
GO

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

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

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

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

我得到这个问题,因为我正在生成我的EDMX从一个现有的数据库(由别人设计,我使用术语“设计”松散在这里)。

结果发现桌子上根本没有钥匙。EF生成了具有多个键的模型。我必须在SQL中添加一个主键到db表,然后在VS中更新我的模型。

这为我解决了问题。

这是对的,只要加一个主键

注意:请确保当您从数据库更新EF图时,您指向正确的数据库,在我的情况下,连接字符串指向一个本地DB,而不是最新的Dev DB,我知道,学生错误,但我想发布这个,因为它可以非常令人沮丧,如果你确信你已经添加了主键,你仍然得到相同的错误

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

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

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