关于EF调用存储过程碰到的问题解决过程

网上有人说不建议在EF中用存储过程,或许他是对的。

1. 调用mysql存储过程,存储过程为返回两个结果集

CREATE PROCEDURE pro_prevnextrecord(IN `iCmsID` varchar(50),IN `iCateID` varchar(50))
BEGIN
	DROP TABLE IF EXISTS tmp1; 
	CREATE TEMPORARY TABLE tmp1(
			`ID` 	 VARCHAR(50) NOT NULL,
			`Num`  INTEGER NOT NULL,
			PRIMARY KEY (`ID`))ENGINE=MyISAM DEFAULT CHARSET=utf8;
		
		INSERT INTO tmp1(ID,Num)
		SELECT id,row_no FROM 
		(SELECT a.id,a.CategoryID,a.Sysid,(@row_num:=@row_num+1) as row_no  from cmscontent a,(select(@row_num:=0)) b ORDER BY a.categoryID,a.Sysid desc) c 
		WHERE c.CategoryID=iCateID		
		;
		
	  SELECT (@Num :=Num) as mynum FROM tmp1 WHERE id=iCmsID;

		SELECT CONCAT('productdetail?ID=',a.id) AS LinkUrl,
		CASE WHEN @Num<a.Num then '下一张' ELSE '上一张' END AS LinkText
		FROM tmp1 a LEFT JOIN cmscontent b ON a.id=b.id WHERE a.Num=@Num-1 or a.Num=@Num+1 ORDER BY a.Num;


END


2. 在edmx生成存储过程函数方法.

现在双击edmx文件,展开视图界面右键找到从数据库更新模型,可以百度这里操作存储过程的资料。

如果在DbContext继承类里没有自动生成相应函数,则再次双击edmx文件,在展开的视图界面右键找到模型浏览器,单击它。在Store节点下存储过程/函数菜单里面可以发现所调用的存储过程名称,选中右键添加函数导入,返回复杂内容类型,点确定。

3. 选择edmx使用xml方式修改

在相应节点下修改成以下内容:

          <FunctionImport Name="pro_prevnextrecord" >
            <ReturnType Type="Collection(lab_equiModel.prevNextRecordResult1)"></ReturnType>
            <ReturnType Type="Collection(lab_equiModel.prevNextRecordResult2)"></ReturnType>
            <Parameter Name="iCmsID" Mode="In" Type="String" />
            <Parameter Name="iCateID" Mode="In" Type="String" />
            </FunctionImport>

 <ComplexType Name="prevNextRecordResult1" >
          <Property Name="mynum" Type="Int32" />
        </ComplexType>
        <ComplexType Name="prevNextRecordResult2" >
          <Property Name="LinkUrl" Type="String" MaxLength="70" Unicode="true" FixedLength="false" />
          <Property Name="LinkText" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
        </ComplexType>

 <FunctionImportMapping FunctionImportName="pro_prevnextrecord" FunctionName="lab_equiModel.Store.pro_prevnextrecord" >
            <ResultMapping>
              <ComplexTypeMapping TypeName="lab_equiModel.prevNextRecordResult1">
                <ScalarProperty Name="mynum" ColumnName="mynum" />
              </ComplexTypeMapping>
            </ResultMapping>
            <ResultMapping>
              <ComplexTypeMapping TypeName="lab_equiModel.prevNextRecordResult2">
                <ScalarProperty Name="LinkUrl" ColumnName="LinkUrl" />
                <ScalarProperty Name="LinkText" ColumnName="LinkText" />
              </ComplexTypeMapping>
            </ResultMapping>
          </FunctionImportMapping>


4. 运用T4模板

在tt扩展名文件的属性里面,检查自定义工具命名空间,空白的话就写上自己需要的命名空间。然后在其右键菜单上运行自定义工具。这里能自动补全返回集合类的各个字段。

5. 返回多记录集

在logic代码层,设置函数如下:

        public List<prevNextRecordResult2> GetPrevnextrecord(string iCmsID, string iCateID)
        {
            var result2 = db.pro_prevnextrecord(iCmsID, iCateID).GetNextResult<prevNextRecordResult2>();
            return result2.ToList();
        }
调用结果集在第二张表,则用 GetNextResult

6.参考文章

http://www.codeproject.com/Articles/675933/Returning-Multiple-Result-Sets-from-an-Entity-Fram

https://q.cnblogs.com/q/56836/

http://blog.csdn.net/leftfist/article/details/39226243

http://www.cnblogs.com/chenliyang/p/6633534.html




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值