Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Automapper MapsTo属性在引用的类上不起作用_C#_.net_Automapper - Fatal编程技术网

C# Automapper MapsTo属性在引用的类上不起作用

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

我正在努力理解我做错了什么。我一直在解决方案中使用Automapper+Automapper.Attributes(),最近我不得不将我的API项目拆分为一个“核心”库和原始API。当类文件移到API项目之外时,Automapper无法创建映射。我已经设置了一个具有以下结构的演示项目来确认这个问题:(可在此处获得:)

  • 解决方案
    • 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(客户)为您绘制地图?既然您已经为您的问题中的人到课程映射定义了映射,它就起作用了。但是对于狗,你已经定义了