質問: 次の列を持つdbテーブルがあります。 * ウィジェットID(PK) * WidgetName * WidgetCreatedOn * WidgetLastUpdatedOn Widgetテーブルに更新/削除/挿入を処理するプロシージャが格納されています。 Insert stored procは、パラメータとしてWidgetName **だけを**取ります。 ``` exec Widget_Insert @WidgetName='Foo Widget' ``` 次に、ストアドプロシージャは、WidgetCreatedOn WidgetLastUpdatedOn自体の日付を入力します。 Widgetオブジェクトは、テーブルと同じプロパティを持ちます。 * WidgetId(キー) * WidgetName * WidgetCreatedOn * WidgetLastUpdatedOn 特定のプロパティを無視するようにMapToStoredProceduresに指示することは可能ですか? ``` modelBuilder.Entity() .MapToStoredProcedures(s => s.Insert(i => i.HasName("Widget_Insert") .Parameter(a => a.WidgetName, "WidgetName") .Parameter(a => a.WidgetCreatedOn, **dont map it**) .Parameter(a => a.WidgetLastUpdatedOn, **dont map it**))); ``` 私たちはコードファーストをやっています
回答: これを行うためにMapToStoredProcedures設定を手動で変更する方法があるかもしれませんが、私はそれをまだ明らかにしていません。それを言いましたが、これを達成する方法があります。私は、EFがあなたに何かをやろうとしていると仮定しています。 モデルマッピングで、IdentityまたはComputedのDatabaseGeneratedOptionを指定すると、そのプロパティがinsert procに送信されなくなります。 あなたがそれについて考えるなら、これはある意味があります。インサートプロシージャは、インサートを実行するためにできるだけ多くの情報をモデルから取得します。しかし、アイデンティティ/計算されたプロパティは、あなたがそのデータの代わりにデータを提供すると言っているため、そのデータのモデルをモデルに見せないというものです。 このアプローチには注意すべき点が2つあります。 EFは、これらのIdentity / Computedフィールドがprocから戻って来るようになるので、insertの後にselect(SQL ServerのSCOPE_IDENTITY()をフィルタリングする)が必要になります。また、EFでは、Identityフィールドがnullに戻らないと仮定しているため、後で更新するつもりがない場合でも計算されなければなりません。 それほど美味しくない場合は、EF5でこのようなことを行う方法は、コンテキストにSaveChangesをオーバーライドし、型がウィジェットでEntityState.Addedのときにprocを呼び出すことです。または、代わりにEFのDBSet Addメソッドを使用して独自のvsでprocを呼び出すようにdevsに強制する例外をスローすることができます。