我为我的用户准备了一个UserViewModel。我想用它来注册。
我不想使用我的数据模型进行注册或登录。
我的UserViewModel如下:
public class UserViewModel
{
public int user_id { get; set; } //Primary Key in user table
[Required]
[DisplayName("Email:")]
public string email { get; set; }
[Required]
[DisplayName("First Name:")]
public string f_name { get; set; }
[Required]
[DisplayName("Last Name:")]
public string l_name { get; set; }
[Required]
[DisplayName("Contact Number:")]
public string contact { get; set; }
[Required]
[DisplayName("Gender:")]
public string gender { get; set; }
[Required]
[DisplayName("Blood Type:")]
public string blood_type { get; set; }
[Required]
[DisplayName("Password:")]
[DataType(DataType.Password)]
public string password { get; set; }
[Required]
[DisplayName("Confirm Password:")]
[DataType(DataType.Password)]
[Compare("password")]
public string confirm_password { get; set; }
}我的注册ActionMethod如下:
[HttpPost]
public ActionResult Registration(UserViewModel uvmr)
{
db.users.Add(uvmr);
db.SaveChanges();
return View();
}我的用户dataModel (user.cs)如下:
public partial class user
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public user()
{
this.appointments = new HashSet<appointment>();
}
public int user_id { get; set; }
public string f_name { get; set; }
public string l_name { get; set; }
public string email { get; set; }
public string contact { get; set; }
public string gender { get; set; }
public string blood_type { get; set; }
public string password { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<appointment> appointments { get; set; }
}注意:我的用户表中没有确认密码列。
现在,错误显示无法从das.Models.ViewModel.UserViewModel转换为das.Models.DataModel.user
这个问题的解决办法是什么?
发布于 2020-11-24 04:14:21
您不能向db.users.Add(uvmr);提供任何对象实例-- DbSet<T>.Add()方法是为每个数据模型指定类型的。
由于您的模型非常相似,因此将一种模型转换为另一种模型相对简单:
var newUser = new user
{
user_id = uvmr.user_id
f_name = uvmr.f_name
l_name = uvmr.l_name
email = uvmr.email
contact = uvmr.contact
gender = uvmr.gender
blood_type = uvmr.blood_type
password = uvmr.password
};然后,您可以添加新的user实例:
db.users.Add(newUser);假设您不想在每次需要将一个映射到另一个时复制此代码,您可以创建一个映射实用程序-我倾向于使用静态类来实现:
public static class Mapper
{
public static user MapUser(UserViewModel uvmr)
{
return uvmr == null ? null : new user
{
user_id = uvmr.user_id
f_name = uvmr.f_name
l_name = uvmr.l_name
email = uvmr.email
contact = uvmr.contact
gender = uvmr.gender
blood_type = uvmr.blood_type
password = uvmr.password
};
}
}然后你可以这样做:
var user = Mapper.MapUser(uvmr);当然,像AutoMapper这样的实用程序也可以做同样的事情,而且在您的例子中可能会更简单- AutoMapper,即使没有任何设置代码,也会尝试映射具有相同名称的属性。
顺便说一句,您的类名和属性目前违反了微软的命名约定--如果这是要在组织外部共享的代码,我建议您阅读Naming Guidelines。
https://stackoverflow.com/questions/64973908
复制相似问题