首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将ViewModel转换为DataModel

无法将ViewModel转换为DataModel
EN

Stack Overflow用户
提问于 2020-11-24 02:09:49
回答 1查看 66关注 0票数 0

我为我的用户准备了一个UserViewModel。我想用它来注册。

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

我的UserViewModel如下:

代码语言:javascript
复制
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如下:

代码语言:javascript
复制
    [HttpPost]
    public ActionResult Registration(UserViewModel uvmr)
    {
        db.users.Add(uvmr);
        db.SaveChanges();
        return View();
    }

我的用户dataModel (user.cs)如下:

代码语言:javascript
复制
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

这个问题的解决办法是什么?

EN

回答 1

Stack Overflow用户

发布于 2020-11-24 04:14:21

您不能向db.users.Add(uvmr);提供任何对象实例-- DbSet<T>.Add()方法是为每个数据模型指定类型的。

由于您的模型非常相似,因此将一种模型转换为另一种模型相对简单:

代码语言:javascript
复制
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实例:

代码语言:javascript
复制
db.users.Add(newUser);

假设您不想在每次需要将一个映射到另一个时复制此代码,您可以创建一个映射实用程序-我倾向于使用静态类来实现:

代码语言:javascript
复制
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 
        };
    }
}

然后你可以这样做:

代码语言:javascript
复制
var user = Mapper.MapUser(uvmr);

当然,像AutoMapper这样的实用程序也可以做同样的事情,而且在您的例子中可能会更简单- AutoMapper,即使没有任何设置代码,也会尝试映射具有相同名称的属性。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64973908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档