2012-12-24 24 views
0

我需要使用實體框架(代碼優先)列出所有訂單及其相應的客戶ID。這應該可以不查詢Customers表,因爲客戶ID是Orders表中的FK。但是,EF也會根據訂單和客戶表生成選擇。獲取相關實體ID而不加載它

這是用於查詢命令中的實體模型和代碼:

public class Order 
{ 
    public virtual Guid Id { get; set; } 

    public virtual string Description { get; set; } 

    public virtual Customer Customer { get; set; } 
} 

public class Customer 
{ 
    public virtual Guid Id { get; set; } 

    public virtual string Name { get; set; } 
} 

using (var context = new LazyLoadingEfContext()) 
{ 
    foreach (var order in context.Orders) 
    { 
     Console.WriteLine("Order {0}, Customer {1}", order.Description, order.Customer.Id); 
    } 
} 

的SQL生成如下:

SELECT 
1 AS [C1], 
[Extent1].[Id] AS [Id], 
[Extent1].[Description] AS [Description], 
[Extent1].[Customer_Id] AS [Customer_Id] 
FROM [dbo].[Orders] AS [Extent1] 

exec sp_executesql N'SELECT 
[Extent2].[Id] AS [Id], 
[Extent2].[Name] AS [Name] 
FROM [dbo].[Orders] AS [Extent1] 
INNER JOIN [dbo].[Customers] AS [Extent2] ON [Extent1].[Customer_Id] = [Extent2].[Id] 
WHERE ([Extent1].[Customer_Id] IS NOT NULL) AND ([Extent1].[Id] =  
@EntityKeyValue1)',N'@EntityKeyValue1 uniqueidentifier', 
@EntityKeyValue1='FF947EF3-5A3F-4A26-BDB9-039C49F559A7' 

(加其它相同的與用於參數的不同值的查詢@ EntityKeyValue1)

是否有任何方法配置EF以從「父」對象檢索相關實體ID而不是加載相關實體?

BTW,我測試過使用NHibernate和只有一個查詢是對Orders表執行同樣的情景:

SELECT this_.Id as Id1_0_, this_.Description as Descript2_1_0_, 
this_.Customer_id as Customer3_1_0_ FROM [Order] this_ 
+0

爲什麼你要在訂單中的每個屬性之前放置虛擬? –

+0

嘗試註釋屬性外鍵爲適當的字段... –

+0

@BhushanFrake虛擬應只在客戶屬性(對此感到遺憾)。 – jrowies

回答

2

試試這個:

public class Order 
{ 
    public virtual Guid Id { get; set; } 

    public virtual string Description { get; set; } 

    public Guid CustomerID { get; set; } 

    [ForeignKey("CustomerID ")] 
    public virtual Customer Customer { get; set; } 
} 

之後,你應該能夠只需在您的foreach循環內獲得order.CustomerID,而無需查詢Customers表。

+0

感謝您的答案,但我寧願離開我的領域模型儘可能乾淨,添加一個CustomerID屬性將工作(實際上,這是我做的,以避免性能問題),但我想知道是否有辦法避免在沒有該解決方法的情況下加載完整實體。 – jrowies

+0

我幾乎可以肯定沒有。調用'order.Customer。*'(其中*是任何Customer屬性)總是會導致對數據庫的查詢。 – MarcinJuraszek

+0

@MarcinJuraszek:看起來像。通過'int' ID我看到EF推斷關聯實體的主鍵值(不查詢其他實體)。有了guid,這似乎是不同的。 @jrowies:暴露原始外鍵可能會污染模型,但它通常在EF中推薦(請參閱Lerman和Miller的書DbContext)。 –

相關問題