3

は、私はEF4コード-最初のAPIから次のエラーを取得しています:EF4コードファーストPOCOエンティティをインターフェイスとして使用して返すことはできますか?後で問題のコードを考える

指定されたプロパティの役割」を サポートナビゲーションプロパティではありません。 プロパティ要素タイプ 'IRole'は、 であり、サポートされているエンティティタイプではありません。 インターフェイスタイプはサポートされていません。

基本的に、私は次のようなリポジトリがあります。IRepository.GetUserがたIUserを返すこと

public class Repository : IRepository { 
    private IEntityProvider _provider; 
    public Repository(IEntityProvider provider) { 
     _provider = provider; 
    } 
    public IUser GetUser(int id) { 
     return _provider.FindUser(id); 
    } 
} 

お知らせ。

私のIEntityProviderの実装は、次のようになります。

public class EntityProvider : IEntityProvider { 
    public IUser FindUser(int id) { 
     /* Using Entity Framework */ 
     IUser entity; 
     using (var ctx = new MyDbContext()) { 
      entity = (from n in ctx.Users 
        where n.Id == id 
        select (IUser)n).FirstOrDefault(); 
     } 
     return entity; 
    } 
} 

ここで重要なのはたIUserインターフェースが一覧<IRole>プロパティと呼ばれる役割を持っているということです。このため、Entity Frameworkでは、プロパティが必要とするIRoleインターフェイスを満たすためにどのクラスを使用するのかを最初に判断できないようです。

以下は、システム全体で使用されるインターフェイスとPOCOエンティティであり、うまくいけばEF4でも使用されます。

public interface IUser { 
    int Id { get; set; } 
    string Name { get; set; } 
    List<IRole> Roles { get; set; } 
} 

public interface IRole { 
    int Id { get; set; } 
    string Name { get; set; } 
} 

public class User : IUser { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<IRole> Roles { get; set; } 
} 

public class Role : IRole { 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

私はこれについて間違った方法をしていますか? EF4コードファーストAPIの中でこれを行う方法はありますか?

私は、次を考えることができます:

  1. コード-最初EF4で使用されているshadowプロパティ(一覧<役割> DbRoles)のいくつかの並べ替えを。データ注釈を使用して、実際のリスト<IRole>がEF4によって無視されることを確認します。
  2. EF4コードファーストが使用するすべてのエンティティに対して重複したクラスを作成し、それらをインターフェイスを実装する正式なものにマッピングします。
+0

なぜインターフェイスを代わりに使用しますか? –

+1

これは間違いなくこの質問の中核です。インターフェースを使用することで、改訂されたエンティティが古いインターフェース、代替の実装を実装できるようにするなどの柔軟性が得られます。下流アプリケーションは、ドメインエンティティなどの知識なしにインターフェースを処理できます。しかし、 。 – jedatu

+0

柔軟性は注意を払うべきことですが、現実的でなければなりません。あなたは実際にドメインレベルでそれを必要としますか? –

答えて

1

インターフェイスの使用は、EF 4 Code First(CTP5以降)ではサポートされておらず、RTMでもサポートされていません。あなたのオブジェクトを保持する抽象クラスをDbContextに作成するといいでしょう。

+0

大丈夫、ありがとう、それは良い情報です。抽象クラスの考え方を拡張できますか?インターフェイスの代わりに各エンティティの抽象基本クラスを推奨していますか? – jedatu

+0

IRepository :T:クラス(またはRootEntityのようなもの)T Find(Guid id)など – hazimdikenli

2

RootEntityを何も持たないことをお勧めします。次に、Idのようないくつかの共通情報を持つBaseエンティティを作成することをお勧めします。 InsertedBy、UpdatedByはスタンドアットフィールドのように、すべてを簡単にします。

関連する問題