0

これはEntity Framework 6.1.3です。Entity Framework - EFに依存しないプロシージャと関数の生成されたシグネチャを作成する

私のストアドプロシージャのinterfaceを抽出したいと考えています。そして、私はこのインターフェイスがEntityFramwork.dllアセンブリに依存しないようにしたいので、抽象的な方法でクライアントレイヤに公開することができます。そのため、Entity Frameworkに対する認識/参照/依存関係はありません。

EFは、生成されたメソッドシグネチャにObjectResultObjectParameterのようなクラスを挿入するという問題があります。これらのクラスはアセンブリ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の知識がある方は、簡単な解決策を提示することができます...

ありがとうございます!

答えて

0

ソリューションは、クライアントに最も適した方法でインターフェイスを定義し、EFが必要とするコードに適応する実装を持つことです。

つまり、T4テンプレートを編集したり、EFを悪用したりして、四角い穴の丸いペグを締め付けようとしないでください。代わりに、EFをラップする、またはEFに呼び出しを委譲し、返されたデータをインターフェイスに合った方法で変換する独立した実装を作成します。この実装にはおそらく数行のコードしか含まれていないかもしれません。代わりに、ストアドプロシージャを扱っているため、式から完全にEFを削除し、ADOを介してSPを直接呼び出すため、変換に対処する必要があります。ネット。このSPをEFでモデル化することはあまり意味がないかもしれません。

+0

これは私が現在やっていることです。私は現在、元の署名が適切でないときはいつでも、EF生成メソッドへの呼び出しを「翻訳」する部分クラスファイルで定義されたラッパーメソッドを持っています。問題は私のDBが正確に2364の手続きを持っているので、長期的にはうまくいきません。それぞれのラッパーメソッドを手動で作成することは実現不可能です。自動生成されたコードは私の場合に行く方法です。 EFは戻り値の型のPOCO DTOクラスを生成するので、これらのプロシージャを呼び出すにはEFを使用するのが理にかかります。これはビジネスビューレイヤーで使用するのに最適です。 –

+0

2364 SP?ワオ。それは挑戦になるでしょう。それで幸運。 – Steven

+0

ありがとう!システムには何十年もの古いものがあります...また、数千ものテーブル、トリガ、機能があります...すべてがDBと非常に結びついています。私はEFを使用してすべてを.NETアーキテクチャに移行し、プロシージャのロジックをビジネスクラスに書き換えることで、若返らせようとしていますが、すべてのSPから簡単に切り離すことは不可能です。それら。 –

関連する問題