0

Мой ApplicationUser является довольно стандартным, сгенерированный шаблон проекта MVC 5, с добавлением FullName и интерфейс IPayCaddyEntity:Почему я не могу сопоставить «ApplicationUser» с моделью просмотра с помощью AutoMapper?

public class ApplicationUser : IdentityUser, IPayCaddyEntity 
{ 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    { 
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     // Add custom user claims here 
     return userIdentity; 
    } 

    public string FullName { get; set; } 
} 

Новый интерфейс только:

public interface IPayCaddyEntity 
{ 
    string Id { get; set; } 
} 

и уже реализуется по IdentityUser, имеющему stringId. Все строит и в основном работает нормально. Тогда я хочу, чтобы отобразить список пользователей к ViewModel:

public class PlayerViewModel: PayCaddyViewModel 
{ 
    public string FullName { get; set; } 
} 

Они должны карту красиво, оба имеют один и тот же тип FullName свойство. Я стараюсь это:

Mapper.CreateMap<ApplicationUser, PlayerViewModel>().ReverseMap(); 
Mapper.AssertConfigurationIsValid(); 

тогда это:

var players = _db.Users.ToList() 
var model = Mapper.Map<IList<PlayerViewModel>>(players); 

Map вызов бросает исключение.

Я пытаюсь включить объекты Identity в свою собственную базу данных, а свойство Users - это DbSet<ApplicationUser, что мой DbContext наследует от IdentityDbContext<ApplicationUser>.

Полный стек трассировки:

[AutoMapperMappingException: Missing type map configuration or unsupported mapping. 

Mapping types: 
ApplicationUser -> PlayerViewModel 
PayCaddy.Data.Models.ApplicationUser -> PayCaddy.Client.Models.PlayerViewModel 

Destination path: 
IList`1[0] 

Source value: 
System.Data.Entity.DynamicProxies.ApplicationUser_4342C7C6E2802320D156341C80F8DED74454F28D43628C766C6951DB971B9BDA] 
    AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) +610 
    AutoMapper.Mappers.EnumerableMapperBase`1.Map(ResolutionContext context, IMappingEngineRunner mapper) +482 
    AutoMapper.Mappers.CollectionMapper.Map(ResolutionContext context, IMappingEngineRunner mapper) +126 
    AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context) +610 
    AutoMapper.MappingEngine.MapCore(Object source, Type sourceType, Type destinationType, MappingOperationOptions options) +179 
    AutoMapper.MappingEngine.Map(Object source, Type sourceType, Type destinationType, Action`1 opts) +59 
    AutoMapper.MappingEngine.Map(Object source, Action`1 opts) +92 
    AutoMapper.MappingEngine.Map(Object source) +93 
    AutoMapper.Mapper.Map(Object source) +62 
    PayCaddy.Client.Controllers.<PlayersIndex>d__11.MoveNext() in C:\Development\Cordova\PayCaddy\PayCaddy.Client\Controllers\AccountController.cs:65 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +97 
    System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) +17 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32 
    System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50 
    System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225 
    System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34 
    System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26 
    System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 
    System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36 
    System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 
    System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9723757 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 
+0

Вы уверены, что вызвана CreateMap? Где вы это называете? – thepirat000

+0

@ thepirat000 В конструкторе контроллера. Я знаю, что это не идеальное место, но я хотел увидеть, что его называют близким к тому, где вызывается «Карта». Сначала я использовал его в статическом конструкторе модели представления. – ProfK

ответ

1

Ваша проблема должна быть CreateMap не вызывается, так как ваш код работает отлично, как вы можете видеть в this .NET fiddle.

Двойная проверка, правильно ли вызывается CreateMap. Попробуйте вызвать его в методе Application_Start(), файле Global.asax.cs.

+0

Отлично, спасибо. Остается загадкой, почему 'CreateMap' в контроллере ctor не работал, но' Application_Start() 'в порядке. – ProfK

Смежные вопросы