2012-01-05 88 views
7

我正在使用實體框架(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

可能的解決方法/ 9805329/how-to-use-interface-properties-with-codefirst/10994290#10994290 – Cel 2012-06-12 10:22:42

回答

6

實體框架無法使用接口。您的導航屬性必須使用真實的實體類型(映射類)。

+0

但我有一個只包含接口的項目讓我說我有一個名爲「IEnumerable GetOrders(IOrderService) ICustomer客戶)「(這又會調用一個存儲庫來獲取數據,請不要試圖找到這個錯誤,這僅僅是一個例子)。我不能在這裏使用真正的實體類型,因爲這個項目需要引用真實的實體,這看起來不是正確的方法,即接口項目引用了真實類型。它通常應該是其他方式。 – RKP 2012-01-05 19:05:37

+0

事實上,我將Entity Framework項目的一個單獨項目中的所有EF實體都用作業務對象,而不依賴於持久性。所有的映射和​​數據庫上下文等都在一個單獨的項目中,它具有對實體項目的引用。 – RKP 2012-01-05 19:06:06

+0

這不依賴於持久性。這只是實體和EF對它的依賴。簡單的EF不支持它,我不知道任何解決方法。將您的接口和實體合併爲單個程序集,並使用真實實體類型定義導航屬性。 – 2012-01-05 19:11:54

1

「你可以添加自己的部分類文件來指定要實現的接口 - 並提供您所需要的任何實際的實施方法」 - 作爲http://stackoverflow.com/questions建議here