我收到错误消息:值不能为null,为什么我的ICollection始终为null?

时间:2019-10-31 12:35:18

标签: c# asp.net asp.net-core entity-framework-core

这是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

1 个答案:

答案 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());