4

エンティティフレームワークを最初に使用してアプリケーションを作成していますが、インタフェースセグメンテーションの原則に従ってEFの制限に関するいくつかの問題に直面しています。 Part of application model architecture in UMLEntity Frameworkナビゲーションプロパティのインターフェイスタイプ

public interface IProduct 
{ 
    int Id { get; set; } 
    ICollection<IProcess> Processes { get; set; } 
    ICollection<ILine> Lines { get; set; } 
    String Description { get; set; } 
    String Number { get; set; } 
    String Name { get; set; } 
} 

問題は、プロセスと、それが具体的な形でどのクラス(私は推測)を把握することはできません。原因行プロパティです。

私は抽象クラスを使ってほとんど同じことが達成できることを知っています。私がこれをやっただけではない理由は、EFの制限のためにモデルを変更するのが間違っているということです。

これを解決する最善の方法は何ですか?ナビゲーションプロパティとしてのインターフェイスを許可するEFの代替品。

+0

私はEFが、それはデータベース – Kralizek

+0

はいから取得するエンティティをマテリアライズするときインスタンス化するために、具体的なタイプを知っておく必要があると。今ここから私は何をしていますか? :) – brianfroelund

答えて

3

これを解決する唯一の方法は、データベースに永続化された具象クラスを使用することです。 EFは他の方法をサポートしていません。抽象クラスを使用しても、継承ツリー全体をマッピングしない限り、あなたを助けません(そうしないでください)。

あなたがプロパティインタフェースを暴露したい場合は、内部のコンクリートタイプを暴露プロパティからの変換を行います第二の非マッピングされたプロパティを提供しなければなりません。

単にEFを使用する場合は、アーキテクチャを曲げて機能セットに従わせる必要があります。

+0

実際に多型を使用する必要がある場所はどうですか?私は、エンティティフレームワークに固執すれば、いくつかの部分に抽象クラスを使用するように強制されます。代わりにNHibernateに行くことを選択した場合私は同じ問題に直面するだろうか? – brianfroelund

+0

多態性を使用する必要がある場合は、抽象クラスの複数の実装があり、この場合、継承をマップする必要があります。あなたのモデルから、複数のインタフェースの実装があることは明らかではありませんでした。私はNHibernateがインターフェイスをサポートすると思います。 –

+0

これは部分的なモデルなので、全体がかなり大きくなります。迅速な答えをありがとう! – brianfroelund

0

私はこれが古いスレッドだと知っていますが、他の誰かがそれに出くわした場合、私はEFを使用するための少し良い回避策があります。私は2つのインターフェイス

public interface IProduct 
{ 
    int Id { get; set; } 
    String Description { get; set; } 
    String Number { get; set; } 
    String Name { get; set; } 
} 

public interface IEFProduct 
{ 
    ICollection<IProcess> Processes { get; set; } 
    ICollection<ILine> Lines { get; set; } 
} 

を持って

は基本的に私は私のモデルの残りの部分のため、それはまだ完全に独立して、私の契約プロジェクトでIProductインターフェースを保つが、私は置きますIEFProduct私のモデルプロジェクトのインターフェイスこれは、具体的な実装を保持します。つまり、具体的な型ではなくインターフェイスを実装しているものからプロセスや行にアクセスすることはできませんが、私の場合はこの問題を回避できます。

他の方法は、DTOを使用することです。

あなたのモデルはすべてインターフェイスを使用しますが、実際のEF実装では、手動またはAutomapperを使ってマップするデータレイヤーにConcrete DTOを使用します。