これはEntity Framework 6.1.3です。Entity Framework - EFに依存しないプロシージャと関数の生成されたシグネチャを作成する
私のストアドプロシージャのinterface
を抽出したいと考えています。そして、私はこのインターフェイスがEntityFramwork.dllアセンブリに依存しないようにしたいので、抽象的な方法でクライアントレイヤに公開することができます。そのため、Entity Frameworkに対する認識/参照/依存関係はありません。
EFは、生成されたメソッドシグネチャにObjectResult
とObjectParameter
のようなクラスを挿入するという問題があります。これらのクラスはアセンブリEntityFramework.dllで定義されているため、抽出したインタフェースにdependenecyを注入します。これは避けたいものです。
私はObjectResult
問題をこのように解決:私はMyEntities.Context.tt
ファイルを編集した、と方法public string FunctionMethod(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption)
の内側に私はもともと、このでした行が見つかりました:
returnType == null ? "int" : "ObjectResult<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">",
だから私はこれにそれを変更:
returnType == null ? "int" : "System.Collections.Generic.IEnumerable<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">",
したがって、生成されたプロシージャの戻り値の型はもはやObjectResult<>
ではなく、IEnumerable<>
です。
しかし、私はObjectParameter
の場合の問題を解決できませんでした。これらはOutputパラメーター(またはInOutパラメーター)があるときにEFによって生成されます。たとえば、ref int myParam
のメソッドシグニチャのデフォルトで生成されたObjectParameter myParam
を置き換えたいとします。 ObjectParameterの処理は、メソッドのコードの中ではなく、シグネチャの中に保持してください。したがって、各メソッドはObjectParameterを内部的に作成し、戻り値をout/refメソッドのパラメータに配置する必要があります。
私は努力しましたが、そのような方法でMyEntities.Context.tt
を編集する方法を見つけることができませんでした。たぶん、T4とEFの知識がある方は、簡単な解決策を提示することができます...
ありがとうございます!
これは私が現在やっていることです。私は現在、元の署名が適切でないときはいつでも、EF生成メソッドへの呼び出しを「翻訳」する部分クラスファイルで定義されたラッパーメソッドを持っています。問題は私のDBが正確に2364の手続きを持っているので、長期的にはうまくいきません。それぞれのラッパーメソッドを手動で作成することは実現不可能です。自動生成されたコードは私の場合に行く方法です。 EFは戻り値の型のPOCO DTOクラスを生成するので、これらのプロシージャを呼び出すにはEFを使用するのが理にかかります。これはビジネスビューレイヤーで使用するのに最適です。 –
2364 SP?ワオ。それは挑戦になるでしょう。それで幸運。 – Steven
ありがとう!システムには何十年もの古いものがあります...また、数千ものテーブル、トリガ、機能があります...すべてがDBと非常に結びついています。私はEFを使用してすべてを.NETアーキテクチャに移行し、プロシージャのロジックをビジネスクラスに書き換えることで、若返らせようとしていますが、すべてのSPから簡単に切り離すことは不可能です。それら。 –