代码之家  ›  专栏  ›  技术社区  ›  Robert Claypool

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

  •  8
  • Robert Claypool  · 技术社区  · 16 年前

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

    是我遗漏了什么,还是这是一个bug?
    有什么解决办法吗?


    使用Visual Studio 2008 v9.0.30729.1 SP(Service Pack 1)
    3 回复  |  直到 8 年前
        1
  •  8
  •   Craig Stuntz    16 年前

    与其说它是一个bug,不如说它缺少一个特性。实体框架目前不支持返回标量值的存储过程。我相信这应该会在.NET4.0中发生变化。同时,您可以通过使用存储连接来执行这样的存储过程,该存储连接可通过 CreateDbCommand .

        2
  •  4
  •   toby toby    15 年前

    由于现在唯一有效的方法是将返回类型映射到实体,因此一种解决方法是创建一个与返回数据相对应的视图,并为该视图创建一个实体。仅当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
    

    创建函数导入,设置返回类型以查看_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
  •  3
  •   Darius Kucinskas    15 年前