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);
     }
4

1 回答 1

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 没有保持这种状态。

于 2013-05-08T03:19:52.250 回答