具有非实体返回类型的实体模型中的函数导入

Posted

技术标签:

【中文标题】具有非实体返回类型的实体模型中的函数导入【英文标题】:Function Imports in Entity Model with a non-Entity Return Type 【发布时间】:2010-10-09 09:02:21 【问题描述】:

我的实体数据模型中有一个存储过程,并将其添加到函数导入中。

问题是...当且仅当我将返回指定为实体类型时,Visual Studio 才会在模型的代码隐藏中生成函数代码。 标量和空返回类型不起作用。当我选择它们时,Visual Studio 不会生成函数代码。

是我遗漏了什么,还是这是一个错误? 任何变通办法?


使用 Visual Studio 2008 v9.0.30729.1 SP(服务包 1)

【问题讨论】:

【参考方案1】:

与其说是错误,不如说是缺少功能。实体框架现在不支持返回标量值的存储过程。我相信这应该在 .NET 4.0 中改变。同时,您可以通过CreateDbCommand 使用存储连接来执行这样的存储过程。

【讨论】:

谢谢。 UI 具有欺骗性,因为它允许选择标量和空返回类型。 我有一个关于使用 CreateDbCommand 的后续问题。见:***.com/questions/587173/…【参考方案2】:

由于现在唯一可行的是将返回类型映射到实体,因此一种解决方法是创建一个与返回数据对应的视图并为该视图创建一个实体。这仅在 SP 执行 SELECT 以返回结果集而不是返回值时才有效。我让它与示例应用程序一起使用,如下所示: SP:

ALTER PROCEDURE [dbo].[DoSomething]
    @param1 varchar(50),
    @param2 varchar(50)
AS
BEGIN
    DECLARE @ID INT
    SET NOCOUNT ON;
    INSERT tmp_header (fname, lname) VALUES (@param1, @param2) 
    SET @ID = SCOPE_IDENTITY()
    SELECT @ID AS 'id'
END

查看:

CREATE VIEW [dbo].[View_1]
AS
SELECT   0 as  id

创建函数导入,将返回类型设置为 View_1 并构建模型。

在代码中:

    class Program
    
      static void Main(string[] args)
      
        using (PS_RADSTESTEntities ctx = new PS_RADSTESTEntities())
        
          EntityConnection ec = ctx.Connection as EntityConnection;
          ec.Open();
          DbTransaction txn = ec.BeginTransaction();
          ObjectResult<View_1> result = ctx.DoSomething("Toby", "Kraft");
          View_1 row = result.Single();
          int id = row.id;
// do some other interesting things ...
          ctx.SaveChanges();
          txn.Commit();
        
      
    

确保在视图和 SP 之间将列名设置为完全相同。 托比

【讨论】:

【参考方案3】:

我遇到了类似的问题并使用这篇文章解决了它:

http://blogs.msdn.com/bindeshv/archive/2008/11/21/using-stored-procedures-that-return-non-entity-type.aspx

【讨论】:

以上是关于具有非实体返回类型的实体模型中的函数导入的主要内容,如果未能解决你的问题,请参考以下文章

具有实体框架问题的 Informix 存储过程

错误 6046:无法生成存储函数的函数导入返回类型

热门模拟具有不同类型返回值的函数?

Symfony - Doctrine 实体的返回类型

使用代码优先模型的 Kendo 网格绑定

Symfony - Doctrine实体的返回类型