2012-01-05 4 views
7

最新のバージョンのEntity Framework(4.2)を使用していて、エンティティのインターフェイスを実装しようとしていますが、何らかの理由でコンパイルできません。エラー "Cannot convert expression type ICollection<IOrder> to return type ICollection<Order>"が送出されています。エンティティのインタフェースを使用しない場合、このエラーは発生しません。エンティティフレームワーク(4.2)エンティティのインターフェイスを使用するとエラーが発生する

私はインターフェース(リポジトリとサービスなど)のための別のプロジェクトを持っており、これらのメソッドのEFエンティティをパラメータとして渡す必要があります。実際のエンティティを渡す必要はありません。 EFエンティティへの依存関係を持つようにします。

私の目標は、ここではサンプルです。この記事Can I abstract Entity Framework away from my Entities?

で述べたものに似ています。私はちょうどここにサンプルを入れて、私の実際のエンティティは異なっていますが、問題は同じです。

public interface IOrder 
{ 
    int OrderId { get; set; } 
    int CustomerId { get; set; } 
    ICustomer Customer { get; set; } 
} 

public class Order : IOrder 
{ 
    public int OrderId { get; set; } 
    public int CustomerId { get; set; } 
    ICustomer Customer { get; set; } 
} 

public interface ICustomer 
{ 
    int CustomerId { get; set; } 
    ICollection<IOrder> Orders { get; set; } 
} 

public class Customer : ICustomer 
{ 
    public int CustomerId { get; set; } 
    ICollection<IOrder> Orders { get; set; } 
} 

public class OrderMap : EntityTypeConfiguration<Order> 
{ 
    this.HasOptional(t => t.Customer) 
    .WithMany(t => t.Orders) //error comes from this line 
    .HasForeignKey(d => d.CustomerId); 
} 
+0

可能な回避策がhttp://stackoverflow.com/questionsで示唆したように/ 9805329/how-to-use-interface-properties-with-codefirst/10994290#10994290 – Cel

答えて

6

エンティティフレームワークはインターフェイスでは動作しません。ナビゲーションプロパティでは、実際のエンティティタイプ(マップされたクラス)を使用する必要があります。

+0

しかし、私は "IOrderService"というメソッドを持っていると言うようなインターフェースしか持たないプロジェクトがある "IEnumerable GetOrders (これは、データをフェッチするためのリポジトリを呼び出します。plsはこれを使ってフォルトを見つけようとしません。これは単なる例です)。実際のエンティティタイプを使用することはできません。なぜなら、このプロジェクトは、実際のエンティティへの参照を必要とするためです。それは通常、他の方法で行うべきです。 – RKP

+0

実際、Entity Frameworkプロジェクトとは別のプロジェクトにすべてのEFエンティティがあり、永続性に依存することなくビジネスオブジェクトとして利用できます。すべてのマッピングとデータベースコンテキストなどは別のプロジェクトにあり、エンティティプロジェクトへの参照を持っています。 – RKP

+0

これは永続性に依存しません。これはエンティティ間の依存関係であり、EFはそれを要求します。単にEFはそれをサポートしておらず、私は回避策を知らない。インタフェースとエンティティを単一のアセンブリにマージし、実際のエンティティタイプでナビゲーションプロパティを定義します。 –

1

「あなたが実装するインタフェースを指定するために、独自のパーシャルクラスファイルを追加することができます - あなたが必要な任意の実際の実装方法を提供すること」 - here

関連する問題