0

我有一个用户视图模型供我的用户使用。我想用它来注册。

我不想使用我的数据模型进行注册或登录。

我的 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();
    }

我的用户(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

这个解决方法是什么?

4

1 回答 1

0

您不能只提供任何对象实例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,即使没有任何设置代码,也会尝试映射具有相同名称的属性。

顺便说一句,您的类名和属性当前违反了 Microsoft 的命名约定 -如果这是要在您的组织外部共享的代码,我建议您阅读命名指南。

于 2020-11-23T20:14:21.160 回答