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

戻りセットを「厳密に入力」する必要があります。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");
}

申し訳ありませんが、訂正- 生成されたメソッドは良さそうに見えますが、実際には機能しません。2 番目のバージョンは、必要なスカラー結果ではなく、ストアド プロシージャから RETURN コードを返しています。ストアド プロシージャにテーブル変数を追加すると、Entity Framework Add Function Import ウィザードの [Get Column Information] ボタンに影響があり、Nullable 列が true から false に変わります。ただし、戻り値の型を Scalar に設定すると、生成されたメソッドは引き続き 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 に答える