c# - 在通用存储库中加载导航属性
问题描述
一起使用 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
填充。然而,MealType
是null
,因此ExistingMealDto.MealType
也是null
。我可以通过显式调用来解决这个问题DbContext.MealTypes.ToList()
,但是由于该方法应该是通用的TIn
,因此这不是生产解决方案。
我该如何解决这个问题?谢谢!
解决方案
在泛型方法中获取相关数据,可以判断传入类型的类型。下面是一个测试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>();
}
推荐阅读
- python-3.x - 将节点列表转换为python中的嵌套字典
- angular - 需要在前端的角度应用程序中从第一次用户中删除 otp 选项并在后端航行
- javascript - 使用 axios 查看原始请求响应头
- python - PyQt5 线程无响应
- c++ - 日志函数返回不正确的值
- angular - 如何使用 jsPDF 呈现多个分页结果(HTML 到 PDF)
- python - 打印 M x N 网格,每个网格内都有字符
- wpf - WPF 从主窗口获取命令行参数到视图模型中
- android - 如何在 Android 中通过字符串或文件名确定主要媒体类型?
- javascript - 如何使用反应钩子创建反应多步模态表单