2013-05-07 61 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