6

我有一種情況,我想使用單個業務邏輯類來對各種實體框架類執行類似的操作。我已經定義了這些類在部分類文件中實現的接口。通過接口屬性LINQ to Entities

然而,當我嘗試寫一個LINQ到實體查詢針對這些接口中的方法,因爲查詢不直接,但通過一個接口使用類的屬性,我得到一個NotSupportedException異常。

我想繁重存到數據庫層等是有辦法做到這一點,而不訴諸LINQ的對象?

下面是一些代碼,演示了我的問題(它使用的由工廠創建了一個通用存儲庫類)。

public interface INamedEntity 
{ 
    int ID { get; set; } 
    string Name { get; set; } 
} 

// This is an Entity Framework class which has CustomerID and CustomerName properties. 
public partial class Customer: INamedEntity 
{ 
    int INamedEntity.ID 
    { 
     get { return this.CustomerID; } 
     set { this.CustomerID = value; } 
    } 
    string INamedEntity.Name 
    { 
     get { return this.CustomerName; } 
     set { this.CustomerName = value; } 
    } 
} 

... 

public string GetName<T>(int entityID) where T: EntityObject, INamedEntity 
{ 
    using(var repository = RepositoryFactory.CreateRepository<T>()) 
    { 
     return repository 
      .Where(e => e.ID == entityID) 
      .Select(e.Name) 
      .Single(); 
    } 
} 

回答

0

查詢執行期間發生以下異常,該異常基於泛型源和where子句中使用的接口成員。

NotSupportedException異常:接口構件[InterfaceName中] [成員名稱]的映射不被支持。

只有當查詢應該返回多個項目以及何時使用==運算符時,纔會發生異常。當用First,FirstOrDefault或Single執行查詢時,或者當我在where子句中使用equals或其他運算符時,我無法重現該錯誤。

參考:Interface not supported

+0

是的,這看起來像問題。 – gareththegeek 2012-02-17 10:50:41

5

這是不支持的。您的Linq-to-entities查詢只能使用您實體的映射屬性。如果使用接口屬性,EF不知道如何將它們轉換爲SQL,因爲它無法在屬性實現中分析您的代碼。

不要爲實體使用接口 - EF根本不支持它。在你的特殊情況下,它甚至不能與任何其他ORM一起工作,因爲你正在查詢映射未知的屬性。這需要您構建自己的Linq提供程序,將您的查詢翻譯爲使用真實映射屬性進行查詢。

+0

但是有什麼辦法可以實現這種模式。理想情況下,每個功能區域都會有業務邏輯單元,在接口上工作並映射到所有相關實體。 – gareththegeek 2012-02-17 10:53:00

+1

但是這意味着EF上的另一個「映射」層將會將您的業務邏輯接口屬性轉換爲真正的EF屬性。該映射層也將轉換查詢。我不稱這種模式 - 我稱它爲架構應用程序。 – 2012-02-17 11:23:01

+0

也許是超架構,但是如何避免將相同的代碼複製並粘貼到多個業務層對象中,以便它們可以執行相同的邏輯,但是使用不同名稱的實體屬性? – gareththegeek 2012-02-17 13:46:07