我有两个型号 用户 和 UserModelDto 都有一些共同的属性,而且从客户端我得到了 UserModelDto 模型,我想将其转换为 用户 ,以便插入数据库(我正在使用实体框架)。当它转换 UserModelDto 的所有属性值时,我想复制到 用户 ,无论该属性是否包含值如果不包含那么分配给它的手动(如null)适当的值。我希望它以通用的方式。 模型 用户 看起来像
public partial class User
{
public User()
{
this.UserRoles = new HashSet<UserRole>();
}
public int Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailId { get; set; }
public string Password { get; set; }
public Nullable<int> ManagerId { get; set; }
public byte AuthenticationType { get; set; }
public Nullable<bool> RememberMe { get; set; }
public Nullable<bool> IsActive { get; set; }
public Nullable<bool> IsOnVacation { get; set; }
public Nullable<bool> IsManager { get; set; }
public Nullable<int> CreatedBy { get; set; }
public Nullable<int> UpdatedBy { get; set; }
public Nullable<System.DateTime> CreatedOn { get; set; }
public Nullable<System.DateTime> UpdatedOn { get; set; }
public int LoginAttempts { get; set; }
public bool ResetPassword { get; set; }
public Nullable<System.DateTime> LastDealAssignedDateTime { get; set; }
public virtual ICollection<UserRole> UserRoles { get; set; }
}
和模型 UserModelDto 看起来像......
public class UserModelDto
{
public int UserId { get; set; }
public string UserName { get; set; }
public byte AuthenticationType { get; set; }
public string EmailId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsOnVacation { get; set; }
public bool IsManager { get; set; }
public bool IsActive { get; set; }
public int ManagerId { get; set; }
public int PrimaryRoleid { get; set; }
}
我尝试的是
public User ConvertToUserModel(UserModelDto userModel)
{
User convertedUser = new User();
if (userModel!=null)
{
convertedUser.Id = userModel.UserId != null ? userModel.UserId : 0;
convertedUser.AuthenticationType = userModel.AuthenticationType != null ? userModel.AuthenticationType : 0;
convertedUser.EmailId = userModel.EmailId != null ? userModel.EmailId :null;
convertedUser.FirstName = userModel.FirstName != null ? userModel.FirstName : null;
convertedUser.LastName = userModel.LastName != null ? userModel.LastName : null;
convertedUser.IsOnVacation = userModel.IsOnVacation != null ? userModel.IsOnVacation : false;
convertedUser.IsActive = userModel.IsActive != null ? userModel.IsActive : false;
convertedUser.IsManager = userModel.IsManager != null ? userModel.IsManager : false;
convertedUser.ManagerId = userModel.ManagerId != null ? userModel.ManagerId :0;
convertedUser.UserName = userModel.UserName != null ? userModel.UserName :null;
}
return convertedUser;
}
答案 0 :(得分:4)
我建议您查看Automapper之类的内容,它完全符合您的要求。它允许您使用许多配置选项,并且我已经多次将它用于这个确切的用例。
这是你真正要做的事情。
//Type on left is source type, type on right is destination
Mapper.CreateMap<UserModelDto, User>();
User user = Mapper.Map<User>(userDto);
要从UserDto
转到User
,您只需创建一个翻转类型的新映射器,并按照相同的模式。
有一个nice in depth video可以为您提供更多关于使用Automapper可以做些什么的示例,但在这种情况下,默认配置应该可以正常工作。
答案 1 :(得分:2)
我使用名为AutoMapper的实用程序: https://www.nuget.org/packages/AutoMapper/
这允许您将一个对象转换为另一个对象,简单如下:
User mappedUser = AutoMapper.Map<User>(userModelDto);
虽然可以在配置中定义特殊的映射规则,但这会自动映射相同类型和名称的属性。