Я получаю ошибку: значение не может быть нулевым, почему моя ICollection всегда равна нулю? - PullRequest
1 голос
/ 31 октября 2019

это модуль 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; }
}

я отображаю OrganizationPhoto в автомате с помощью dtos

        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, но это ноль см. изображение

1 Ответ

1 голос
/ 31 октября 2019

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...