EF DataBase 优先 存储过程的问题

baidu_27549073 2017-05-18 10:04:03
ADO.Net 实体模型映射的储存过程方法返回值int是返回的受影响的行数。我应该怎么使用EF来获取return值?
ExecuteFunction方法的 参数类型是ObjectParameter,不能像SqlParamter那样指定ParameterDirection。
这个地方我临时用Database.ExecuteSqlCommand改写了,但是我对EF的设计比较感兴趣(因为感觉它的设计跟我的思想经常不能达成一致),有没有这方面的书籍可以推荐下。
...全文
233 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_27549073 2017-05-22
  • 打赏
  • 举报
回复
引用 3 楼 hanjun0612 的回复:
我更习惯使用 dbcontext.database.SqlQuery<>().ToList()方法。 无论是存储过程还是sql语句。通过泛型来控制返回类型
终于研究出来了,我需要的其实是重写或扩展Linq中的QueryAble方法
baidu_27549073 2017-05-19
  • 打赏
  • 举报
回复
引用 3 楼 hanjun0612 的回复:
我更习惯使用 dbcontext.database.SqlQuery<>().ToList()方法。 无论是存储过程还是sql语句。通过泛型来控制返回类型
但是这个要写SQL啊,我的整体思路是避免在程序中写SQL。 我想到的DAL框架思路是这样的:将数据库结构映射到程序中作为数据库模型,封装关键字from,select,and,ro,where 和一些常用SQL结构作为helper类或则泛型。在程序中就可以很容易访问数据库对象。 下面是个简化版的样子:

public class 数据库{
  string 数据库连接{get;set;}
   #region 将表映射成类
   #endregion
  #region 将存储过程封装为方法
 #endregion
}
public static class 表{
public static string TableName="table"'//对应的数据库表名
 public  static string IDField="ID";//ID字段对应的数据库ID字段
}
public static class Helper{
        /// <summary>
        /// 得到总数据量
        /// </summary>
        /// <param name="Table"></param>
        /// <returns></returns>
        public static string GetTableCount(string Table,string where)
        {
            return string.Format("select count(*) FROM {0} where 1=1  {1}", Table, where);
        }
}
//调用实例
string sql=Helper.GetTableCount(表.TableName,$" and  {表.IDField}=10");//$" and  {表.IDField}=10这一句也会封装成方法,这里不扯远了,先用一个SQL片段代替
然后这个框架写了一部分之后我发现跟EF越来越像,甚至EF有很多地方比我想的跟周到,比如使用一个SQL上下文(IQueryable<T>),可以用方法来改变这个上下文,只是最后才将它生成SQL。只是EF封装的太多,涉及的东西也比较多,有很多我现在用不上的东西,所以我想学习下EF的实现,使用它的底层中纯粹的跟数据库有关的东西,来达到我要的效果。我刚才已经找到了EF的源代码,我要学习去了
正怒月神 2017-05-19
  • 打赏
  • 举报
回复
我更习惯使用 dbcontext.database.SqlQuery<>().ToList()方法。 无论是存储过程还是sql语句。通过泛型来控制返回类型
baidu_27549073 2017-05-18
  • 打赏
  • 举报
回复
刚才那个版本有错误,这个是最终版本
public  virtual int web_serialUse(string serialNumber, Nullable<int> userid, string iP)
        {
            var serialNumberParameter =new SqlParameter("@SerialNumber", serialNumber);
            var useridParameter =  new SqlParameter("@Userid", userid);
            var iPParameter =  new SqlParameter("@IP", iP);
            var result = new SqlParameter("@return", SqlDbType.Int);
            result.Direction = ParameterDirection.ReturnValue;
            SqlHelper.ExecuteNonQuery(Database.Connection.ConnectionString,CommandType.StoredProcedure, "web_serialUse",
                serialNumberParameter, useridParameter, iPParameter, result);
            return Convert.ToInt32(result.Value);
            //var serialNumberParameter = serialNumber != null ?
            //    new ObjectParameter("SerialNumber", serialNumber) :
            //    new ObjectParameter("SerialNumber", typeof(string));

            //var useridParameter = userid.HasValue ?
            //    new ObjectParameter("Userid", userid) :
            //    new ObjectParameter("Userid", typeof(int));

            //var iPParameter = iP != null ?
            //    new ObjectParameter("IP", iP) :
            //    new ObjectParameter("IP", typeof(string));

            //return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("web_serialUse", serialNumberParameter, useridParameter, iPParameter);
        }
baidu_27549073 2017-05-18
  • 打赏
  • 举报
回复
以下是我的解决方案,使用分部类重新这个存储过程,但是这种很麻烦啊。
namespace YundingDAL
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    public partial class THTreasureDBEntities : DbContext
    {
        public  virtual int web_serialUse(string serialNumber, Nullable<int> userid, string iP)
        {
            var serialNumberParameter = serialNumber != null ?
                new SqlParameter("SerialNumber", serialNumber) :
                new SqlParameter("SerialNumber", typeof(string));

            var useridParameter = userid.HasValue ?
                new SqlParameter("Userid", userid) :
                new SqlParameter("Userid", typeof(int));

            var iPParameter = iP != null ?
                new SqlParameter("IP", iP) :
                new SqlParameter("IP", typeof(string));

            var result = new SqlParameter("@return", SqlDbType.Int);
            result.Direction = ParameterDirection.ReturnValue;

            Database.ExecuteSqlCommand("web_serialUse", serialNumberParameter, useridParameter, iPParameter);
            return Convert.ToInt32(result.Value);
            //var serialNumberParameter = serialNumber != null ?
            //    new ObjectParameter("SerialNumber", serialNumber) :
            //    new ObjectParameter("SerialNumber", typeof(string));

            //var useridParameter = userid.HasValue ?
            //    new ObjectParameter("Userid", userid) :
            //    new ObjectParameter("Userid", typeof(int));

            //var iPParameter = iP != null ?
            //    new ObjectParameter("IP", iP) :
            //    new ObjectParameter("IP", typeof(string));

            //return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("web_serialUse", serialNumberParameter, useridParameter, iPParameter);
        }
    }
}

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧