C# Automapper MapsTo属性在引用的类上不起作用
我正在努力理解我做错了什么。我一直在解决方案中使用Automapper+Automapper.Attributes(),最近我不得不将我的API项目拆分为一个“核心”库和原始API。当类文件移到API项目之外时,Automapper无法创建映射。我已经设置了一个具有以下结构的演示项目来确认这个问题:(可在此处获得:)C# Automapper MapsTo属性在引用的类上不起作用,c#,.net,automapper,C#,.net,Automapper,我正在努力理解我做错了什么。我一直在解决方案中使用Automapper+Automapper.Attributes(),最近我不得不将我的API项目拆分为一个“核心”库和原始API。当类文件移到API项目之外时,Automapper无法创建映射。我已经设置了一个具有以下结构的演示项目来确认这个问题:(可在此处获得:) 解决方案 API(客户和个人类别) API.Core(宠物和狗类) API项目引用了API.Core 宠物类映射到狗类 Person类映射到Customer类 AP
- 解决方案
- API(客户和个人类别)
- API.Core(宠物和狗类)
- API项目引用了API.Core
- 宠物类映射到狗类
- Person类映射到Customer类
API.Core-狗类
namespace API.Core
{
public class Dog
{
public string Name { get; set; }
}
}
namespace API.Core
{
[MapsTo(typeof(Dog))]
public class Pet
{
[MapsToProperty(typeof(Dog), "Name")] //Edit: Fixed this typo
public string PetName { get; set; }
}
}
namespace API.Models
{
[MapsTo(typeof(Customer))]
public class Person
{
[MapsToProperty(typeof(Customer), "FirstName")]
public string Name { get; set; }
}
}
namespace API.Models
{
public class Customer
{
public string FirstName { get; set; }
}
}
API.Core-宠物类
namespace API.Core
{
public class Dog
{
public string Name { get; set; }
}
}
namespace API.Core
{
[MapsTo(typeof(Dog))]
public class Pet
{
[MapsToProperty(typeof(Dog), "Name")] //Edit: Fixed this typo
public string PetName { get; set; }
}
}
namespace API.Models
{
[MapsTo(typeof(Customer))]
public class Person
{
[MapsToProperty(typeof(Customer), "FirstName")]
public string Name { get; set; }
}
}
namespace API.Models
{
public class Customer
{
public string FirstName { get; set; }
}
}
API-人员类别
namespace API.Core
{
public class Dog
{
public string Name { get; set; }
}
}
namespace API.Core
{
[MapsTo(typeof(Dog))]
public class Pet
{
[MapsToProperty(typeof(Dog), "Name")] //Edit: Fixed this typo
public string PetName { get; set; }
}
}
namespace API.Models
{
[MapsTo(typeof(Customer))]
public class Person
{
[MapsToProperty(typeof(Customer), "FirstName")]
public string Name { get; set; }
}
}
namespace API.Models
{
public class Customer
{
public string FirstName { get; set; }
}
}
API-客户类别
namespace API.Core
{
public class Dog
{
public string Name { get; set; }
}
}
namespace API.Core
{
[MapsTo(typeof(Dog))]
public class Pet
{
[MapsToProperty(typeof(Dog), "Name")] //Edit: Fixed this typo
public string PetName { get; set; }
}
}
namespace API.Models
{
[MapsTo(typeof(Customer))]
public class Person
{
[MapsToProperty(typeof(Customer), "FirstName")]
public string Name { get; set; }
}
}
namespace API.Models
{
public class Customer
{
public string FirstName { get; set; }
}
}
API-启动
AutoMapper.Mapper.Initialize(cfg => {
typeof(API.WebApiConfig).Assembly.MapTypes(cfg);
});
API-控制器
var person = new Person { Name = "John" };
var customer = AutoMapper.Mapper.Map<Customer>(person);//This Works
var dog = new Dog { Name = "Lucky" };
var pet = AutoMapper.Mapper.Map<Pet>(dog);//This throws exception
var person=newperson{Name=“John”};
var customer=AutoMapper.Mapper.Map(个人)//这很有效
var dog=新狗{Name=“Lucky”};
var pet=AutoMapper.Mapper.Map(狗)//这引发了异常
例外情况:
发生了一个错误。
找到了未映射的成员。查看下面的类型和成员。添加
自定义映射表达式、忽略、添加自定义解析器或修改
无匹配构造函数的源/目标类型,请添加无参数
ctor,添加可选参数,或映射所有构造函数参数
==========================================自动映射器为您创建了此类型映射,但无法使用当前配置映射您的类型。
狗->宠物(目的地成员列表)API.Core.Dog->
API.Core.Pet(目的地成员列表)
未映射属性:PetName
AutoMapper.AutoMapperConfigurationException
在lambda_方法(闭合、狗、宠物、分辨率上下文)处
lambda_方法(闭包、对象、对象、ResolutionContext)
API.Controllers.ValuesController.Get()在
c:\users\greg\Source\Repos\AutoMapperTest\API\Controllers\ValuesController.cs:line
26 at lambda_方法(闭包、对象、对象[])at
System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c__DisplayClass10.b__9(对象
实例,对象[]方法参数)位于
System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象
实例,对象[]参数),位于
System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext
controllerContext,IDictionary`2参数,CancellationToken
取消令牌)
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
System.Web.Http.Controllers.ApiControllerActionInvoker.d_u0.MoveNext()
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
System.Web.Http.Controllers.ActionFilterResult.d_u2.MoveNext()
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext()
Pet类的PetName上的MapStopProperty声明不正确。它应该是typeof(狗)而不是typeof(宠物) 编辑 既然您已经定义了
Person
到Customer
映射的映射,您的问题就解决了。但是在Dog
的情况下,您已经定义了Pet
到Dog
的映射,但是您正在尝试将Dog
对象映射到Pet
对象(但映射不存在)
如果需要双向映射,则建议您使用MapsToAndFromProperty
定义映射
查看链接了解更多详细信息。我遇到了相同的问题(AutoMapper 7.0.0)。问题的关键在于错误消息:“AutoMapper为您创建了此类型映射,但无法使用当前配置映射您的类型”。从6.2.0开始,AutoMapper尝试为未显式映射的类型创建映射,即:在许多情况下,不再需要创建映射
然而,它似乎在使用它自己创建的映射,而不是您定义的映射,即使是您为其显式定义的类型。至少,这是我遇到的
检查此问题的快速方法是:降级到版本6.1.1,然后查看问题是否仍然存在。就我而言,降级解决了问题
我确实有一种感觉,一定有更好的方法来解决这个问题(或者它甚至是一个bug…),但我还不知道如何解决。如果我找到了,我会发回来的。我想我已经在这里抛出了这个,以防您需要快速修复:)Pet类的PetName上的MapStopProperty声明不正确。它应该是typeof(Dog)而不是typeof(Pet)。GITHub项目有使用该特定方法的测试用例,我建议比较并运行这些测试,检查这些示例和代码。@user1672994将其添加为答案;-)为MapStopProperty输入错误道歉。我已经更新了示例项目,但问题仍然存在:does
var customer=new customer{Name=“John”};var person=AutoMapper.Mapper.Map(客户)代码>为您绘制地图?既然您已经为您的问题中的人到课程映射定义了映射,它就起作用了。但是对于狗,你已经定义了