Загрузить свойства навигации в хранилище generi c - PullRequest
0 голосов
/ 09 апреля 2020

У меня проблема при совместном использовании AutoMapper и EF Core для отображения свойств навигации из модели в DTO. Мои классы EF:

public class Meal
{
    public DateTime Day { get; set; }

    public MealType MealType { get; set; }

    public int MealId { get; set; }
}

public class MealType
{
    public string Name { get; set; }

    public int MealTypeId { get; set; }
}

И соответствующие классы DTO:

public class ExistingMealDto
{
    public DateTime Day { get; set; }

    public ExistingMealTypeDto MealType { get; set; }

    public int MealId { get; set; }

    public string MealTypeName { get; set; }
}

public class ExistingMealTypeDto
{
    public string Name { get; set; }

    public int MealTypeId { get; set; }
}

Это мое отображение AutoMapper:

config.CreateMap<DataLayer.EfClasses.MealType, ExistingMealTypeDto>();
config.CreateMap<DataLayer.EfClasses.Meal, ExistingMealDto>()
      .ForMember(x => x.MealType, x => x.MapFrom(x=>x.MealType))
      .ForMember(x => x.MealTypeName, x => x.MapFrom(y => y.MealType.Name));

Я загружаю данные в методе generi c, который выглядит следующим образом:

public IEnumerable<TDtoOut> GetAllAsDto<TIn, TDtoOut>()
        where TIn : class
    {
        var allEntities = DbContext.Set<TIn>();

        return Mapper.Map<IEnumerable<TDtoOut>>(allEntities);
    }

При вызове этого кода все экземпляры Meal загружаются из базы данных, а MealId и Day заполняются правильно. Однако MealType равно null и, следовательно, ExistingMealDto.MealType равно null. Я могу обойти эту проблему, явно вызвав DbContext.MealTypes.ToList(), но так как метод должен быть обобщенным c для TIn, это не производственное решение.

Как я могу решить эту проблему? Спасибо!

1 Ответ

0 голосов
/ 10 апреля 2020

Для получения связанных данных в методе generi c вы можете судить о типе переданного типа. Ниже приводится тестовая демонстрация, к которой можно обратиться:

public IEnumerable<TIn> GetAllAsDto<TIn>()
    where TIn : class
    {
        Type typeParameterType = typeof(TIn);
        if (typeParameterType == typeof(User))
        {
            var Entities = _context.Set<User>().Include(u=>u.Orders);
            return (IEnumerable<TIn>)Entities;
        }

        else
        {
            var allEntities = _context.Set<TIn>();
            return allEntities;
        }
    }

public void Test()
{
     var data = GetAllAsDto<User>();
     var data1 = GetAllAsDto<Status>();
}

Результат enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...