最近项目用到EF,虽然说EF与Linq To SQL有很多地方相似,但是EF(这里指3.5版,4.0版的还没去留意)确实有些地方做得不够方便。
就拿存储过程来说吧,EF里面想调用存储过程不是直接在数据库里拖进来就可以用,还要做一个function import的步骤来建立映射。 如果你的存储过程返回的是一个select * from .....的语句的话,那恭喜你,你的存储过程可以直接使用了。但是如果你的存储过程是返回标量值的呢?那不行,你会发现你的代码提示里面还是没有出现想要的存储过程名称。
  代码生成器 ;
为什么呢?原因就是EF没有为返回标量值的存储过程自动生成cs代码,他只是在edmx文件里面写上了诸如
<Function Name="GetOrder" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<Parameter Name="OrderID" Type="int" Mode="In" />
</Function>
这样一串映射配置。如需在EF中调用这种存储过程的话,就必须自己写一个通用的调用方法,以下是方法的代码:
private T ExecuteFunction<T>(string functionName, System.Data.EntityClient.EntityParameter[] parameters) where T : struct
{
System.Data.EntityClient.EntityCommand cmd = ((System.Data.EntityClient.EntityConnection)this.Connection).CreateCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(parameters);
cmd.CommandText = this.DefaultContainerName + "." + functionName;
try
{
if (cmd.Connection.State != System.Data.ConnectionState.Open)
cmd.Connection.Open();
var obj = cmd.ExecuteScalar();
return (T)obj;
}
catch (System.Exception)
{
throw;
}
finally
{
cmd.Connection.Close();
}
}
其中泛型T就是你的存储过程返回值的类型。
虽然说有了调用方法,但是你还不可以放松,注意到方法里面有这样一句 var obj = cmd.ExecuteScalar();这句的意思就是获取返回表格的第一行数据,这有什么问题呢?问题就在于他只能拿到形式为表格(table)的返回值,如果你的存储过程是用return来返回结果的话,那不好意思,上面的方法会抛出一个The data reader returned by the store data provider does not have enough columns for the query requested.的异常,原因是return的存储过程并没有返回表格。这样的话,我们必须还要修改一下存储过程,把return改成select,这样就能顺利调用了。
分享到:
相关推荐
存储过程,具有: 单一结果类型 多种结果类型 输出参数 表值函数,返回 实体类型 复杂类型 标量值函数 可组合的 不可组合的 汇总功能 内建功能 尼拉迪奇功能 模型定义的功能 EntityFramework.Functions库可在带有...
Entity Framework 6 Recipes Entity Framework 6 Recipes
Entity Framework Core Cookbook - Second Edition by Ricardo Peres English | 9 Nov. 2016 | ISBN: 1785883305 | 340 Pages | MOBI/EPUB/PDF+Code Files | 6.2 MB Entity Framework is a highly recommended ...
本书是关于Entity framework code first 的详细介绍,在本书中,你可以学到从无到有的创建基于Entity framework code first的项目
Entity Framework 6 (EF6) is a tried and tested object-relational mapper (O/RM) for .NET with many years of feature development and stabilization.
Entity Framework Repository(含依赖注入)
entityframework框架源代码,需要深入了解entityframework的同学可以下载深入学习研究
电子书 Entity Framework 4 In Action
Z.EntityFramework.Extensions,基于2019年7月,3.21.2.0去除每月验证和强签名。适合.net4.0及以上
ef entityframework服务端 封装dll
Z.EntityFramework.Extensions 破解 注册机,详细破解方法
Entity Framework完整版教程,从初级到中级,再到高级,循序渐进。
Entity Framework 6 Recipes provides an exhaustive collection of ready-to-use code solutions for Entity Framework, Microsoft's model-centric, data-access platform for the .NET Framework and ASP.NET ...
Entity Framework Core in Action 2nd Edition
EDM中存储过程的设计 15 EDM中ComplexType的设计 16 实体数据模型映射方案 17 Entity Framework的原理及使用方式 18 各种使用方式总结 18 使用技巧及需要注意的问题 21 几种方法的性能分析及使用选择 21 其它...
如果使用Entity Framework也用了Z.EntityFramework.Plus.EF6且同时使用Entity Framework Profiler或MiniProfiler监控EF生成的SQL,你可能会遇到他们不兼容的问题,原因是Z.EntityFramework.Plus.EF6识别数据库类型...
Entity Framework provides a model-based system that makes data access effortless for developers by freeing you from writing similar data access code for all of your domain models. Mastering Entity ...
entity framework 教程下载
用于演示EntityFramework6在CodeFirst模式下如何连接Oracle数据库的实例Demo 使用CRUD方式创建数据表,详细连接说明见代码注释,只需要更换连接字符串中的账户和数据库地址即可 .Net框架为4.5请注意匹配
ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service ...