这件事让我发疯,错误对我来说毫无意义:
无法更新 EntitySet 'TableB',因为它有一个 DefiningQuery 并且元素中不存在支持当前操作的元素。
我的表是这样放置的:
TableA int idA (identity, primary key) ... TableB int idA (FK for TableA.idA) int val
TableB 在 SQL 服务器中没有定义的主键。实体框架已导入表和关联,并将这两个字段设置为键。但是当我尝试插入表时它会输出该错误!
怎么了??
编辑:正如亚历克斯所建议的,解决方案是这样的:
右击 edmx 文件,选择打开方式,XML 编辑器在 edmx:StorageModels 元素中定位实体 完全移除 DefiningQuery 将 store:Schema="dbo" 重命名为 Schema="dbo" (否则代码会产生错误说名称无效)删除 store:Name 属性
我把钥匙原样留下,因为我认为这两列都是钥匙的一部分。
好吧,当遇到没有 PrimaryKey 的表时,它会被视为视图。
视图显示在 StorageModel\EntitySet[n]\DefiningQuery 元素中的 EDMX 文件(在 XML 编辑器中打开以查看)中。
当您有一个 DefiningQuery 时,实体变为只读,除非您添加修改函数。您需要 3 个修改函数(又名存储过程),分别用于插入、更新和删除。
但是你有两个选择:
更改键定义:
并让EF相信它认为是视图的其实是一个表或者添加适当的修改函数
在你的情况下,我推荐(1)。
只需向表中添加一个主键。而已。问题解决了。
ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)
我的桌子上缺少主键并收到此错误消息。我注意到的一件事是,在我将密钥添加到表格后,我需要使用设计器从 edmx 中清除表格,保存 edmx,然后再次更新以重新添加表格。它没有拿起钥匙因为它已经被指定为视图。这不需要手动编辑 edmx。
给表添加主键,从edmx模型中删除模型,然后从数据库中选择更新,构建并运行......
@Palantir。验证你的两个表都设置了主键,并小心在一个表中设置了多个主键。
您需要在记事本或记事本++ 或您选择的任何文本编辑器中手动打开 .EDMX 文件。在步骤 1 中打开的文件中找到 edmx:StorageModels 中的条目。找到 DefiningQuery 元素并完全删除此标记。找到 store:Schema="dbo" 到 Schema="dbo" (如果跳过这一步会产生名称无效的错误)。保存并关闭文件。
希望它能解决问题。