继承classAutoMapper.AutoMapperMappingException

inherited class AutoMapper.AutoMapperMappingException

我是 automapper 的新手,它是一个很好用的好东西,但现在我有一个问题。尝试将我的派生 class 转换为基础,它给了我

AutoMapper.AutoMapperMappingException

Missing type map configuration or unsupported mapping.

Mapping types: ClientEventDb -> EventId
Database.ClientEventDb -> EventId

Destination path: ClientEvent

Source value:

Event:Login

Automapper 想要将 ClientEventDb 转换为 EventId?我不明白为什么。 EventId 是一个枚举...

请帮帮我,我 运行 没主意了。

这是我 运行:

的代码
ClientEventDb[] edbl;
using (var context = new DbEntities())
{
    edbl=context.Events.Take(1000).ToArray();
}
Mapper.CreateMap<ClientEventDb, ClientEvent>();
Console.WriteLine("hello");
return edbl.Select(edb => Mapper.Map<ClientEvent>(edb)).ToArray();

这是我的 classes

   [Table("events", Schema = "public")]
    public class ClientEventDb : ClientEvent
    {
        public ClientEventDb(string userName, EventId happening, object userObject = null)
            : base(userName, happening, userObject)
        {

        }
        public ClientEventDb()
        {

        }
    }

[ProtoContract]
[Table("events", Schema = "public")]
public class ClientEvent : ClientEventBase
{
    [ProtoMember(1)]
    [Column("username")]
    public string UserName { get; private set; }

    [ProtoMember(2)]
    [Column("time")]
    public DateTime DateTime { get; private set; }

    [ProtoMember(3)]
    [Key]
    [Column("id")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string Id { get; private set; }

    [ProtoMember(4)]
    [Column("data")]
    public byte[] UserObject { get; set; }

    public ClientEvent(string userName,EventId happening, object userObject=null) : base(happening)
    {
        UserName = userName;
        DateTime = DateTime.Now;
        //UserObject = null;
        if (userObject!=null) throw new NotImplementedException();
    }
    public ClientEvent()
    {

    }
    protected ClientEvent Clone()
    {
        return (ClientEvent)MemberwiseClone();
    }
}

[ProtoContract]
[ProtoInclude(10, typeof(ClientEvent))]
public class ClientEventBase
{

    [Column("eventid")]
    [ProtoMember(1)]
    public int EventIdValue { get; set; } //must be public because of entity framework

    [NotMapped]
    public EventId EventId
    {
        get { return (EventId) EventIdValue; }
        set { EventIdValue = (int) value; }
    }

    public ClientEventBase(EventId eventId)
    {
        EventId = eventId;
    }
    public ClientEventBase()
    {

    }
    public override string ToString()
    {
        return String.Format("Event:{0}",EventId);
    }
}

public enum EventId
{
    Login = 1,
    Logout,
    ExitApplication,
}

更新

错误修复:ClientEvent [Key] 属性移至 id 属性

解决方案是这样的(感谢 stuartd):

ClientEventDb[] edbl;
using (var context = new DbEntities())
{
    edbl=context.Events.ToArray();
}
Mapper.CreateMap<ClientEventDb, ClientEvent>().ConstructUsing((ClientEventDb src) => new ClientEvent());
return edbl.Select(Mapper.Map<ClientEvent>).ToArray();

AutoMapper 很困惑,因为它在不同 classes 中的相似属性之间进行映射,您使用不正确 - 您只需要从派生的 class 转到不存在的基础需要自动映射器。你可以用它来做你需要的....

ClientEventDb[] edbl;
using (var context = new DbEntities())
{
    edbl=context.Events.Take(1000).ToArray();
}

return edbl.Cast<ClientEvent>().ToList();

我想看看为什么你甚至觉得你需要一个派生的 ClientEventDb - 理解我们这里没有完整的图片,但它似乎除了基础 class 已经做的事情之外什么都不做。

问题是 ClientEvent 有两个构造函数,但您没有告诉 AutoMapper 使用哪个。

如果您希望它使用带参数的构造函数,请将您的映射代码更改为此,它将起作用:

Mapper.CreateMap<ClientEventDb, ClientEvent>()
      .ConstructUsing(src => new ClientEvent(src.UserName, src.EventId));

或者使 AutoMapper 使用默认构造函数:

Mapper.CreateMap<ClientEventDb, ClientEvent>()
      .ConstructUsing((ClientEventDb src) => new ClientEvent());