C# AutoMapper无法从实体模型转换为viewmodel
我只是按照安装和设置AutoMapper,我想我已经正确设置了它。但当我尝试从C# AutoMapper无法从实体模型转换为viewmodel,c#,entity-framework,asp.net-core-mvc,automapper,C#,Entity Framework,Asp.net Core Mvc,Automapper,我只是按照安装和设置AutoMapper,我想我已经正确设置了它。但当我尝试从IEnumerable映射到IEnumerable时,如下所示: var categories = _context.ProductCategories.Include(e => e.Children).ToList(); var topLevelCategories = categories.Where(e => e.ParentId == null); var VMCategory = _mapper
IEnumerable
映射到IEnumerable
时,如下所示:
var categories = _context.ProductCategories.Include(e => e.Children).ToList();
var topLevelCategories = categories.Where(e => e.ParentId == null);
var VMCategory = _mapper
.Map<IEnumerable<ProductCategory>,
IEnumerable<ViewModelProductCategory>>(topLevelCategories);
return View(VMCategory);
。。。这是_CategoryRecursive.cshtml:
@model IEnumerable<MyStore.Models.ViewModels.ViewModelProductCategory>
<ul style="list-style:none;padding-left:0px;">
@if (Model != null)
{
foreach (var item in Model)
{
<li style="margin:8px 0px 0px 0px;">
<ul>
@Html.Partial("_CategoryRecursive.cshtml", item.Children)
</ul>
</li>
}
}
</ul>
@model IEnumerable
@如果(型号!=null)
{
foreach(模型中的var项目)
{
-
@Html.Partial(“_CategoryRecursive.cshtml”,item.Children)
}
}
映射配置文件:
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<ProductCategory, ViewModelProductCategory>();
CreateMap<ViewModelProductCategory, ProductCategory>();
CreateMap<Product, ViewModelProduct>();
CreateMap<ViewModelProduct, Product>();
}
}
公共类映射配置文件:配置文件
{
公共映射配置文件()
{
CreateMap();
CreateMap();
CreateMap();
CreateMap();
}
}
实体模型:
public class ProductCategory
{
public int Id { get; set; }
public int SortOrder { get; set; }
public string Title { get; set; }
[ForeignKey(nameof(ParentCategory))]
public int? ParentId { get; set; }
public ProductCategory ParentCategory { get; set; } //nav.prop to parent
public ICollection<ProductCategory> Children { get; set; } //nav. prop to children
public List<ProductInCategory> ProductInCategory { get; set; }
}
公共类ProductCategory
{
公共int Id{get;set;}
公共int排序器{get;set;}
公共字符串标题{get;set;}
[ForeignKey(姓名(父类别))]
public int?ParentId{get;set;}
public ProductCategory ParentCategory{get;set;}//nav.prop到父级
公共ICollection子项{get;set;}//nav.prop到子项
公共列表ProductInCategory{get;set;}
}
视图模型:
public class ViewModelProductCategory
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Title { get; set; }
public int SortOrder { get; set; }
public string ProductCountInfo
{
get
{
return Products != null && Products.Any() ? Products.Count().ToString() : "0";
}
}
public ProductCategory ParentCategory { get; set; } // Nav.prop. to parent
public IEnumerable<ProductCategory> Children { get; set; } // Nav.prop. to children
public List<ViewModelProduct> Products { get; set; } // Products in this category
public List<ViewModelProduct> OrphanProducts { get; set; } // Products with no references in ProductInCategory
}
公共类ViewModelProductCategory
{
公共int Id{get;set;}
public int?ParentId{get;set;}
公共字符串标题{get;set;}
公共int排序器{get;set;}
公共字符串ProductCountInfo
{
得到
{
返回产品!=null&&Products.Any()?Products.Count().ToString():“0”;
}
}
public ProductCategory ParentCategory{get;set;}//Nav.prop.to parent
public IEnumerable Children{get;set;}//Nav.prop.to Children
公共列表产品{get;set;}//此类别中的产品
公共列表产品{get;set;}//ProductInCategory中没有引用的产品
}
这里的问题:
var VMCategory = _mapper.Map<IEnumerable<ViewModelProductCategory>, IEnumerable<ProductCategory>>(topLevelCategories);
var VMCategory=\u mapper.Map(topLevelCategories);
您应该将代码更改为
var VMCategory = _mapper.Map<IEnumerable<ProductCategory>, IEnumerable<ViewModelProductCategory>>(topLevelCategories);
var VMCategory=\u mapper.Map(topLevelCategories);
说明:
tdestinition=Map(TSource sourceObject)
,但是您交换了括号内的类型TSource
和tdestinition
,发布了完整的异常消息。可能有一些内在的例外可以解释问题所在。使用Exception.ToString()
获取它。这里没有异常消息。Visual Studio正在给出错误,阻止生成。谢谢!现在我又前进了一步,但又面临着另一个错误。请参阅更新的OP.A viewModel的Children属性中的问题。现在您使用集合IEnumerable
,但我在配置中看到,它必须是ViewModelProductCategory
,或者您应该创建类似CreateMap()
的映射规则。属性ParentCategory
var VMCategory = _mapper.Map<IEnumerable<ProductCategory>, IEnumerable<ViewModelProductCategory>>(topLevelCategories);