實體框架是否提供了一個選項來檢索只填充了父對象的外鍵字段的子對象?包含選項以僅返回外鍵
示例代碼可能會更好地說明這一點。
假設你有以下的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);
}
我不這麼認爲。但是,您可以在模型上包含鍵,這意味着您不需要使用FK的遠程端。例如。 'public int UploadedById {get;組; } public User UploadedBy {get;組; }'這是我如何實現這個特殊結果 – 2013-05-08 00:04:54
感謝盧克,這是一個很好的觀點。我很好奇你是如何處理FK存儲的兩個地方的。下游應用程序如何知道在哪個位置檢索該ID?你總是填充兩個嗎?是否有一些你知道要訪問UploadedById和UploadedBy.Id的約定/場景? – Paul 2013-05-08 00:21:23
EF在這方面非常聰明,如果你在任何地方填充它並保存更改,它將採用更改後的值。當您加載沒有導航屬性的實體時,它將使用正確的ID和nav屬性填充FK爲空。這意味着下游的人們可以訪問任何一個屬性,如果他們想要加載完整的導航屬性,他們可以使用遠程的屬性,或者如果他們想要避免那個加載,那麼他們可以使用本地的一個 – 2013-05-08 00:37:09