在通用存储库中加载导航属性

问题描述 投票:0回答:1

一起使用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));

我正在如下所示的通用方法中加载数据:

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

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

[调用此代码时,将从数据库中加载所有Meal实例,并正确填充MealIdDay。但是,MealTypenull,因此ExistingMealDto.MealType也为null。我可以通过显式调用DbContext.MealTypes.ToList()来解决此问题,但是由于该方法对于TIn应该是通用的,因此这不是生产解决方案。

我该如何解决这个问题?谢谢!

c# asp.net-core automapper ef-core-3.1
1个回答
0
投票

要通过通用方法获取相关数据,您可以判断所传递类型的类型。以下是测试演示,您可以参考:

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

© www.soinside.com 2019 - 2024. All rights reserved.