这是OrganizationPhoto模块
public class OrganizationPhoto
{
public int Id { get; set; }
public string Url { get; set; }
public string Description { get; set; }
public DateTime DateAdded { get; set; }
public bool IsMain { get; set; }
public string PublicID { get; set; }
public Organization Organization { get; set; }
public int OrganizationId { get; set; }
}
这是组织模块
public class Organization
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime DateCreated { get; set; }
public string PublicID { get; set; }
public User User { get; set; }
public int UserId { get; set; }
public ICollection<OrganizationPhoto> OrganizationPhotos { get; set; }
public ICollection<OrganizationHeadPhoto> OrganizationHeadPhotos { get; set; }
}
我使用dto在automapper中映射OrganizationPhoto
CreateMap<OrganizationPhoto, PhotosForDetailedDto>();
CreateMap<OrganizationPhoto, PhotoForReturnDto>();
CreateMap<PhotoForCreationDto, OrganizationPhoto>();
然后我通过ID获得组织,例如:
Task<Organization> GetOrganizationById(int id);
和
public async Task<Organization> GetOrganizationById(int id)
{
var organization = await _context.Organizations.FirstOrDefaultAsync(p => p.Id == id);
return organization;
}
然后我尝试从ICollection OrganizationPhotos获取值,但它为null see image
答案 0 :(得分:1)
默认情况下,EF从不加载相关实体。您必须热切或显式加载关系,或设置延迟加载。最好的方法是急于加载,因为这将使用适当的联接在一个查询中完成所有工作:
var organization = await _context.Organizations
.Include(x => x.OrganizationPhotos)
.Include(x => x.OrganizationHeadPhotos)
.FirstOrDefaultAsync(p => p.Id == id);
如果您还需要加载子关系,则可能还需要使用ThenInclude
:
.Include(x => x.OrganizationPhotos)
.ThenInclude(x => x.SomeOtherRelationship)
您应该避免延迟加载,因为如果不关注正在执行的操作,这很容易导致数据库崩溃,但是如果要“自动”加载它们,则首先需要创建属性虚拟的:
public virtual ICollection<OrganizationPhoto> OrganizationPhotos { get; set; }
然后通过以下方式启用延迟加载:
services.AddDbContext<MyContext>(o =>
o.UseSqlServer(Configuration.GetConnectionString("Foo"))
.UseLazyLoadingProxies());