更新EDMX文件时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更新EDMX文件时出错相关的知识,希望对你有一定的参考价值。

我已经看过其他一些关于此的帖子,但没有一个答案似乎有帮助。我正在尝试将存储过程添加到EDMX。我打开图表,单击鼠标右键,然后选择“从数据库更新模型”。我选择“是”来包含敏感数据,我取消选中“在App.config中保存连接设置”。 (此EDMX位于类库中,其唯一目的是容纳此EDMX)。我单击“下一步”,然后选择“添加”选项卡。我展开“存储过程和函数”,然后找到并单击我的存储过程的复选框。我只检查“将选定的存储过程和函数导入实体模型”,然后单击“完成”。我收到的错误是:

An exception of type 'System.ArgumentException' occurred while attempting to update from the database. The exception message is 'Identifier is null or empty!".

我保存图表。我在整个解决方案中搜索我的proc的名称,它只存在于试图调用它的代码中 - 在EDMX中没有实例。

存储的proc定义如下所示:

ALTER Procedure [dbo].[spGetCountableResult]
    @PatientId BIGINT
AS 

我的连接字符串如下所示:

<add name="DB_Entities" connectionString="metadata=res://*/Models.DBContext.csdl|res://*/Models.DBContext.ssdl|res://*/Models.DBContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DB.com;initial catalog=MyDb;user id=MyUser;password=MyPassword;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

我的package.config条目是:

<package id="EntityFramework" version="6.1.3" targetFramework="net45" />

谁知道这里出了什么问题?

答案

问题可能是您的过程执行SELECT而不命名所有列。

见:http://entityframework.codeplex.com/workitem/1529

如果你的程序有类似SELECT 1的东西,你会得到“标识符为空或空!”错误。但如果它是SELECT 1 as 'One'那么它应该工作。

另一答案

等待数小时后,我找到了解决方案

必须有一些具有IF EXISTS的SP或对某些不存在的实体进行相关检查,例如某些#tempTable等。

确保即使使用NULL值,所有对象都可用于EF,然后执行它将起作用。

对我来说,它是200多个SP中的一个导致所有麻烦。

另一答案

尽量不要将存储过程与#user或##全局临时表一起使用。如果您无法转义,请尝试使用output参数或返回显式0。

另一答案

如果在向EDMX添加存储过程时出现错误:尝试从数据库更新时发生类型为System.ArgumentException的异常。异常消息是“标识符为空或空!”。

然后,您可以在存储过程中添加仅设置FMTONLY

BEGIN
    Set FMTONLY off;
END

以上是关于更新EDMX文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架 EDMX 中创建视图之间的关联时出错

从 3.5 升级到 4 时 edmx 文件中的警告

是否可以在 EDMX 文件 C# DB 优先方法中更新多个过程和函数定义

Android Studio:膨胀类片段时出错

有没有最快的方法来更新 edmx?

首先是EF6代码:如何在启动时从EDMX文件加载DbCompiledModel?