它有一个DefiningQuery但没有InsertFunction元素......错误

时间:2009-10-19 14:56:33

标签: asp.net entity-framework

这件事让我发疯,这个错误对我来说毫无意义:

无法更新EntitySet'TableB',因为它有一个DefiningQuery,元素中不存在支持当前操作的元素。

我的表格是这样的:

TableA
int idA (identity, primary key)
...

TableB
int idA (FK for TableA.idA)
int val

TableB在SQL Server中没有定义的主键。实体框架已导入表和关联,并将两个字段都设置为键。但是当我尝试插入表格时它会输出错误!

怎么了?


修改 正如亚历克斯所建议的,解决方案就是:

  1. 右键单击edmx文件,选择Open with,XML editor
  2. 在edmx:StorageModels元素
  3. 中找到实体
  4. 完全删除DefiningQuery
  5. 将商店:Schema =“dbo”重命名为Schema =“dbo”(否则,代码将生成错误,说明名称无效)
  6. 删除商店:名称属性
  7. 我按原样保留了密钥,因为对我来说这两个列都是密钥的一部分。

6 个答案:

答案 0 :(得分:140)

当遇到没有PrimaryKey的表时,它被视为View。

视图显示在StorageModel \ EntitySet [n] \ DefiningQuery元素的EDMX文件中(在XML编辑器中打开)。

当您拥有DefiningQuery时,除非您添加修改功能,否则实体将变为只读。您需要3个修改函数(也称为存储过程),每个函数对应一个插入,更新和删除。

但你有两个选择:

更改密钥定义:

  1. And convince the EF that what it thinks is a view is really a table
  2. 或添加适当的修改功能
  3. 在你的情况下,我建议(1)。

答案 1 :(得分:12)

只需向表中添加主键即可。而已。问题解决了。

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

答案 2 :(得分:5)

我在桌子上丢失了一个主键并收到此错误消息。我注意到的一件事是在我将密钥添加到表后,我需要使用设计器清除edmx中的表,保存edmx,然后再次更新它以重新添加表。它没有拿起密钥因为它已被指定为视图。这不需要手动编辑edmx。

答案 3 :(得分:3)

将主键添加到表中,从edmx模型中删除模型,然后从数据库中选择更新,构建并运行......工作

答案 4 :(得分:1)

@Palantir。验证两个表都设置了主键,并注意表中设置的多个主键。

答案 5 :(得分:0)

  1. 您需要在记事本或notepad ++中手动打开.EDMX文件,或者 在您选择的任何文本编辑器中。
  2. 在步骤1中打开的文件中的edmx:StorageModels中找到条目。
  3. 找到DefiningQuery元素并将其完全删除。
  4. 找到商店:Schema =“ dbo”到Schema =“ dbo”(如果您跳过此步骤 将会产生名称无效的错误。)
  5. 保存并关闭文件。

希望它将解决问题。