0

いくつかのオプションの SQL パラメータを持つ SQL Proc への関数インポートがあります。

CREATE PROC dbo.SomeProc ( @mandatoryField INT, 
                           @optionalField1 INT = NULL, 
                           @optionalField2 DATETIME = NULL ... )

ただし、インポート後、私の DbContext で生成されたメソッドで、EF は次のように署名を作成します。

    public virtual ObjectResult<SomeType> SomeProc(int mandatoryField, 
                                                   Nullable<int> optionalField1, 
                                                   Nullable<DateTime> optionalField2, ...)

つまり、proc を呼び出すときに明示的な null を指定する必要があるため、コードが煩雑になります。

context.SomeProc(valueOfMandatoryField, null, null, ...)

関数インポート マッピングで EF に C# オプションのパラメーターを使用させる方法はありますか (SSDL/CSDL を直接ハッキングすることを意味する場合でも)?

4

1 に答える 1

1

「FunctionImport」の作成時に、SSDL および CSDL の「Parameter」要素に「DefaultValue」属性がありません。必要なことを行う最も簡単な方法は、生成されたコンテキスト クラスのカスタム拡張メソッドを記述することだと思います。

public static class MyContext_Extensions
{
    public static ObjectResult<Nullable<global::System.Int32>> SomeProc(this MyContext context,
        Nullable<global::System.Int32> mandatoryField, 
        Nullable<global::System.Int32> optionalField1 = null, 
        Nullable<global::System.DateTime> optionalField2 = null)
    {
        return context.SomeProc(mandatoryField, optionalField1, optionalField2);
    }
}

...またはあいまいさを排除するために、最後のパラメーターなしでオーバーロード (コンテキスト クラスは部分的) を追加します。

public partial class MyContext
{
    public ObjectResult<Nullable<global::System.Int32>> SomeProc(
        Nullable<global::System.Int32> mandatoryField,
        Nullable<global::System.Int32> optionalField1 = null)
    {
        return this.SomeProc(mandatoryField, optionalField1, null);
    }
}

...または、POCO エンティティ ジェネレーターを使用している場合は、T4 テンプレートを変更します。

于 2012-05-28T07:21:29.473 に答える