AutoMapper 将派生类型映射到基类型
AutoMapper map derived type to base type
我在使用 AutoMapper 和我当前实施的 ASP.NET Identity 时遇到了一些问题。
我的 EF 代码优先模型驻留在它自己的程序集中(由于与其他软件向后兼容,所以使用 .NET 4.0 编译)。
为了使用 ASP.NET Identity(至少需要 .NET 4.5),我在我的 Web 应用程序中创建了一个单独的 class,它继承了数据库模型 class 并实现了 IUser<MyUser, int>
.
//DB-Assembly: .NET 4.0 Code-First Model
public class ModelUser
{
//omitted for brevity
}
//Webapplication: .NET 4.5 -> because I want to use ASP.NET Identity
public class MyUser : ModelUser, IUser<MyUser, int> {}
//ASP.NET Identity UserStore implementation
public class UserStore : IUserStore<MyUser, int>
{
//Works like a charm
public Task UpdateAsync(MyUser user)
{
MyUser dbUser = _ctx.Users.Find(user.Id);
ModelUser mappedUser = Mapper.Map(user, dbUser);
_ctx.Users.AddOrUpdate(u => u.Id, mappedUser);
return Task.FromResult(_ctx.SaveChanges());
}
//Throws "Mapping and metadata information could not be found for EntityType"
public Task CreateAsync(MyUser user)
{
ModelUser dbUser = new ModelUser();
ModelUser mappedUser = Mapper.Map(user, dbUser); //returns MyUser instead of ModelUser at runtime
_ctx.Users.Add(mappedUser);
return Task.FromResult(_ctx.SaveChanges());
}
}
StartUp.cs 中的 AutoMapper 配置:
Mapper.Initialize(cfg => cfg.CreateMap<ModelUser, MyUser>());
AutoMapper 的默认行为是映射到最具体的 class。
我要相反的。
有谁知道如何告诉 AutoMapper 映射到特定的 class 或者有任何其他建议可以解决我的问题?
AutoMapper.Mapper.CreateMap<ModelUser, MyUser>().ReverseMap();
We need to do reversemap to get ModelUser .
我在使用 AutoMapper 和我当前实施的 ASP.NET Identity 时遇到了一些问题。
我的 EF 代码优先模型驻留在它自己的程序集中(由于与其他软件向后兼容,所以使用 .NET 4.0 编译)。
为了使用 ASP.NET Identity(至少需要 .NET 4.5),我在我的 Web 应用程序中创建了一个单独的 class,它继承了数据库模型 class 并实现了 IUser<MyUser, int>
.
//DB-Assembly: .NET 4.0 Code-First Model
public class ModelUser
{
//omitted for brevity
}
//Webapplication: .NET 4.5 -> because I want to use ASP.NET Identity
public class MyUser : ModelUser, IUser<MyUser, int> {}
//ASP.NET Identity UserStore implementation
public class UserStore : IUserStore<MyUser, int>
{
//Works like a charm
public Task UpdateAsync(MyUser user)
{
MyUser dbUser = _ctx.Users.Find(user.Id);
ModelUser mappedUser = Mapper.Map(user, dbUser);
_ctx.Users.AddOrUpdate(u => u.Id, mappedUser);
return Task.FromResult(_ctx.SaveChanges());
}
//Throws "Mapping and metadata information could not be found for EntityType"
public Task CreateAsync(MyUser user)
{
ModelUser dbUser = new ModelUser();
ModelUser mappedUser = Mapper.Map(user, dbUser); //returns MyUser instead of ModelUser at runtime
_ctx.Users.Add(mappedUser);
return Task.FromResult(_ctx.SaveChanges());
}
}
StartUp.cs 中的 AutoMapper 配置:
Mapper.Initialize(cfg => cfg.CreateMap<ModelUser, MyUser>());
AutoMapper 的默认行为是映射到最具体的 class。 我要相反的。
有谁知道如何告诉 AutoMapper 映射到特定的 class 或者有任何其他建议可以解决我的问题?
AutoMapper.Mapper.CreateMap<ModelUser, MyUser>().ReverseMap();
We need to do reversemap to get ModelUser .