实体框架是否提供了一个选项来检索只填充了父对象的外键字段的子对象?包含选项以仅返回外键
示例代码可能会更好地说明这一点。
假设你有以下的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