62

我在我的应用程序中使用 EF。

我尝试将新记录保存\插入到映射表中

并得到以下错误:

Unable to update the EntitySet 'UsersLimitationToCountry' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.

我应该自己在 edmx 中定义它吗?如何?

4

10 回答 10

108

我的多对多映射表缺少 PK

补充,问题就解决了。

于 2013-03-10T15:13:49.097 回答
49

同意接受的答案。只是提供它背后的原因......

当使用没有主键的表完成 EF 映射时,它被视为视图。由于视图是逻辑实体,它们不能被更新。

因此,要么将缺少的主键添加到您的表中,要么将它们视为一个视图,并且不要对它们执行任何更新操作。

于 2014-03-26T00:31:32.217 回答
28

如果您的视图是可更新的,您可以简单地从 .edmx 的 StorageModel 部分内的视图的 EntitySet 定义中删除该元素,并且正常的更新处理将与任何其他表一样工作。

对我来说就是这种情况。简单地删除导致另一个错误。我按照这篇文章的步骤,除了最后一个。为了您的方便,我复制了我遵循的帖子中的 4 个步骤来解决问题,如下所示:

  1. 右击 edmx 文件,选择打开方式,XML 编辑器
  2. 在 edmx:StorageModels 元素中找到实体
  3. DefiningQuery完全 删除
  4. 将 store:Schema="dbo" 重命名为 Schema="dbo" (否则代码会生成错误,说名称无效)
于 2015-01-21T07:19:06.183 回答
12

我在可更新视图上遇到了这个问题。发现这篇文章解决了我的问题。

因此,我的视图的基础表确实定义了主键,但 EF 不知道 PK 中的哪些列,因为实体是在视图上构建的。这里的诀窍是“说服”EF,您的视图可以更新为表格。步骤与上述答案中提到的几乎相同:

  1. 右击 edmx 文件,选择打开方式,XML 编辑器
  2. 在 edmx:StorageModels 元素中找到实体
  3. 完全删除该<DefiningQuery>部分
  4. 将 store:Schema="dbo" 重命名为 Schema="dbo"
  5. 更改store:Type="Views"store:Type="Tables"
于 2017-07-11T14:47:50.240 回答
4

My table didn't have primary key in sql table design. Added it and solved.

于 2018-02-02T11:02:40.177 回答
4
  1. 右击 edmx 文件,选择打开方式,XML 编辑器

  2. 在 edmx:StorageModels 元素中找到实体

  3. 完全删除 DefiningQuery

  4. 将其重命名store:Schema="dbo"Schema="dbo"(否则,代码将生成一个错误,说明名称无效)这些步骤对我有用

于 2015-12-24T12:27:13.797 回答
2

**重新检查您的表没有 PK :** 只需添加主键,然后删除并重新添加表到 edmx 然后它应该可以工作

于 2017-05-15T15:49:12.643 回答
2

确保您的外键表没有多个列名与引用表中的列匹配;只有主键应该在您的参考表与参考表之间匹配。0..1 应该有可区分的列名,为您的列制定命名约定,以确保引用和引用表没有多个匹配的列名。由 ALMwConsult.net 提供

于 2017-01-07T18:24:37.147 回答
1

如果您没有处理表中的主键,那么在 MVC 中更新和插入记录数据库时肯定会出现此问题

用户未处理 DbUpdate 异常

于 2017-05-21T14:52:15.977 回答
0

处理 db first mvc 应用程序。问题是我忘记为表定义主键。通过使用 alter 命令添加主键并更新 DAL(edmx) 解决

于 2017-10-12T14:43:35.307 回答