在尝试更新实体框架中的模型时,为什么我会收到"无法更新EntitySet,因为它有一个DefiningQuery ..."异常?

Tho*_*hew 24 asp.net-mvc entity-framework exception linq-to-sql

使用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>
Run Code Online (Sandbox Code Playgroud)

更新代码是:

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)
        {

        }
    }
Run Code Online (Sandbox Code Playgroud)

为什么我收到此错误?

Tho*_*hew 51

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


Geo*_*ker 8

三件事:

  1. 不要捕捉你无法处理的异常.你正在捕捉每一个可能的异常,然后不做任何事情(除了吞咽它).这是一件坏事™如果出现任何问题,你真的想默默地做什么吗?这导致了很难调试的损坏状态.不好.

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

  3. 您是否尝试过此处概述的解决方案?您发布的例外有些截止,所以我不能确定它是完全相同的(如果不是,请更新您的帖子),如果它是相同的,您可以评论以下是否适用于您?

"[..]实体框架不知道给定视图是否可更新,因此它添加了<DefiningQuery>元素以防止框架尝试针对不可更新视图生成查询.

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

如果您的视图不可更新,则必须通过"修改函数映射"自行提供更新逻辑.修改函数映射调用.edmx的StorageModel部分中定义的函数.该函数可能包含数据库中存储过程的名称和参数,或者您可以使用"定义命令"直接在StorageModel您的部分的函数定义中编写插入,更新或删除语句 .edmx." (强调我的,格式化为清晰和Stack Overflow格式

(来源:MSDN上的"Mike" )

  • 关于最佳实践的不相关建议+1(Bad Thing). (3认同)