1

当我将这样的 sql 存储过程导入我的数据库第一个模型时

Declare@A int =0;
Declare@B int =0;
Declare@C int =0;

Set @A = (select Count ...)
Set @B = (select Count ...)
Set @C =  IsNull((@A + @B),0)
Select @C As UseCount

为什么 EF 会在生成的上下文中生成方法签名,返回类型为

ObjectResult<Nullable<int>>

而不仅仅是int我所期望的返回类型?

4

1 回答 1

1

您必须“强烈键入”返回集。一种方法,使用 NOT NULL 列声明表变量

Set @A = (select Count(*) From Tasks)
Set @B = (select Count (*) From Tasks)
Set @C =  IsNull((@A + @B),0)
--Select @C As UseCount 
DECLARE @MyTableVar table(UseCount int NOT NULL)
INSERT @MyTableVar SELECT @C
SELECT TOP(1) UseCount FROM @MyTableVar

也许可以缩短一点。

这会将生成的方法从

public virtual ObjectResult<Nullable<int>> TestProc()
{
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<int>>("TestProc");
}

public virtual int TestProc()
{
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("TestProc");
}

抱歉,更正- 虽然生成的方法看起来不错,但它实际上并不起作用。第二个版本是从存储过程返回 RETURN 代码,而不是所需的标量结果。将表变量添加到存储过程中确实会影响实体框架添加函数导入向导的“获取列信息”按钮 - Nullable 列从 true 更改为 false。但是,如果将返回类型设置为 Scalars,则生成的方法仍然使用 Nullable<>。

您可以在 DbContext 的部分类中手动编码该方法,如下所示:

public partial class OnModelCreatingEntities
{
    public virtual ObjectResult<int> TestProc2()
    {
        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<int>("TestProc");
    }
}

这给出了正确的结果,并且在重新生成类时不会被覆盖。它也适用于原始的 transact-sql。

于 2013-04-11T12:36:47.243 回答