2013-05-07 55 views
1

實體框架是否提供了一個選項來檢索只填充了父對象的外鍵字段的子對象?包含選項以僅返回外鍵

示例代碼可能會更好地說明這一點。

假設你有以下的POCO類...

public abstract class Base 
{ 
    public Guid Id { get; set; } 
} 

public class User : Base 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Photo : Base 
{ 
    public string Description { get; set; } 
    public User UploadedBy { get; set; } 
} 

...假設你已經正確配置DbContext,你怎麼查詢所有Photos名單包括UploadedBy對象,但那UploadedBy對象只包含Id屬性?

我知道我能做到這一點...

return await _dbContext.Photos.Include(p => p.UploadedBy).ToListAsync(); 

...但是,返回整個User對象。

我想要做這樣的事情...

return await _dbContext.Photos.Include(p => p.UploadedBy.Id).ToListAsync(); 

......以表明我只想Id財產回來。

如果我們可以鏈接這些包括,我們將能夠選擇我們想要返回的子對象的每個屬性。

甚至更​​好,我希望能夠配置一個更全球化的設置,這將使我可以隨時請Photos,給我所有的照片成員,甚至是兒童對象,但只填充他們的外鍵等等。

最後一個要求是不那麼重要了,但因爲我可以創建以下擴展方法爲每個POCO對象...

public static IQueryable<Photo> IncludeForigenKeys(this PhotoAlbumDbContext context){ 
     return context.Photos 
      .Include(photo => photo.UploadedBy.Id); 
    } 
+0

我不這麼認爲。但是,您可以在模型上包含鍵,這意味着您不需要使用FK的遠程端。例如。 'public int UploadedById {get;組; } public User UploadedBy {get;組; }'這是我如何實現這個特殊結果 – 2013-05-08 00:04:54

+0

感謝盧克,這是一個很好的觀點。我很好奇你是如何處理FK存儲的兩個地方的。下游應用程序如何知道在哪個位置檢索該ID?你總是填充兩個嗎?是否有一些你知道要訪問UploadedById和UploadedBy.Id的約定/場景? – Paul 2013-05-08 00:21:23

+0

EF在這方面非常聰明,如果你在任何地方填充它並保存更改,它將採用更改後的值。當您加載沒有導航屬性的實體時,它將使用正確的ID和nav屬性填充FK爲空。這意味着下游的人們可以訪問任何一個屬性,如果他們想要加載完整的導航屬性,他們可以使用遠程的屬性,或者如果他們想要避免那個加載,那麼他們可以使用本地的一個 – 2013-05-08 00:37:09

回答

0

據我所知是沒有辦法部分加載導航屬性。

但是,對於外鍵,訪問這些對象時不加載Nav屬性的標準方式是在模型中包含實際的鍵。例如:

public class Photo : Base 
{ 
    public string Description { get; set; } 
    public int UploadedById { get; set; } 
    public User UploadedBy { get; set; } 
} 

即使您沒有實際加載整個導航屬性,該ID也會被填充。

在加載兩者的情況下,您可以更新nav屬性的本地或遠程端的值,並且該更新將在保存時持久保存到數據庫。根據我的經驗,EF在這方面非常聰明。唯一一個變得更棘手的場景是在EF不維持這種狀態的單元測試中。

+0

謝謝盧克!我正在採用這種方法。 – Paul 2013-05-08 18:20:52

+0

@paul沒有問題很高興幫助 – 2013-05-08 20:19:53