首页 > 解决方案 > 在通用存储库中加载导航属性

问题描述

一起使用 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实例都从数据库中加载并MealId正确Day填充。然而,MealTypenull,因此ExistingMealDto.MealType也是null。我可以通过显式调用来解决这个问题DbContext.MealTypes.ToList(),但是由于该方法应该是通用的TIn,因此这不是生产解决方案。

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

标签: c#asp.net-coreautomapperef-core-3.1

解决方案


在泛型方法中获取相关数据,可以判断传入类型的类型。下面是一个测试demo,可以参考:

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>();
}

结果 在此处输入图像描述


推荐阅读