【问题标题】:Why am I getting a "Unable to update the EntitySet because it has a DefiningQuery..." exception when trying to update a model in Entity Framework?为什么在尝试更新 Entity Framework 中的模型时出现“无法更新 EntitySet,因为它有一个 DefiningQuery...”异常?
【发布时间】:2023-04-07 13:43:02
【问题描述】:

在使用 Entity Framework 借助 LINQ to SQL 进行更新时,会引发异常。

System.Data.UpdateException: Unable to update the EntitySet 't_emp' because it has 
a DefiningQuery and no <UpdateFunction> element exists in the   
<ModificationFunctionMapping>

更新代码为:

public void Updateall()
    {
        try
        {


            var tb = (from p in _te.t_emp
                      where p.id == "1"
                      select p).FirstOrDefault();
            tb.ename = "jack";

            _te.ApplyPropertyChanges(tb.EntityKey.EntitySetName, tb);
            _te.SaveChanges(true);
        }
        catch(Exception e)
        {

        }
    }

为什么会出现这个错误?

【问题讨论】:

    标签: asp.net-mvc entity-framework linq-to-sql exception


    【解决方案1】:

    问题出在表结构中。 为了避免错误,我们必须在表中创建一个主键。之后,更新 edmx。问题会解决的

    【讨论】:

    • 谢谢,有人把桌上的PK撤了!
    【解决方案2】:

    三件事:

    1. 不要捕获无法处理的异常。您正在捕获所有可能的异常,然后什么都不做(除了吞下它)。 That's a Bad Thing™ 如果任何事情出现问题,您真的想默默地无所事事吗?这会导致难以调试的损坏状态。不好。

    2. Linq to SQL 是一种 ORM,实体框架也是如此。您可能正在使用 LINQ 来更新对象,但您没有使用 Linq to SQL,而是使用实体框架(Linq to Entities)。

    3. 您尝试过outlined here 的解决方案吗?您发布的异常有些被截断,所以我不能确定它是否完全相同(如果不是,请更新您的帖子),如果相同,您能否评论以下内容是否适用你呢?

    "[..] Entity Framework 不知道给定视图是否可更新 与否,所以它添加了&lt;DefiningQuery&gt; 元素以保护 反对让框架尝试生成针对 不可更新的视图。

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

    如果您的视图不可更新,则必须提供更新 通过“修改功能映射”自己逻辑。这 修改函数映射调用定义在 .edmx 的 StorageModel 部分。该函数可能包含 数据库中存储过程的名称和参数,或者您可以 使用“定义命令”来编写插入、更新或 直接在函数定义内的delete语句 StorageModel 部分的 .edmx。”(强调我的,为了清晰和堆栈溢出而格式化的帖子)

    (来源:MSDN 上的“Mike”)

    【讨论】:

    • 感谢您的帮助。问题出在表结构中。定义主键后,不会有任何异常。
    • 已确认,需要在您的桌子上进行 PK(复合 PK 即可)。删除 DefiningQuery 会使事情变得更糟。
    【解决方案3】:

    但如果使用 MVC Asp.net,您可以在模型中设置主键

    只需在您的表格中打开 model.edmx,转到您的字段属性并设置Entity Key = True

    【讨论】:

      猜你喜欢
      • 2012-09-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 2011-11-26
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多