正确使用实体框架生成的类(DB第一种方法)

时间:2016-10-16 13:34:12

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

我正在开发我的第一个MVC5网站,这也是我第一次使用ET。

我正在使用Database First方法。

例如,假设这些是我在Users表中的字段。

| Username | Email | Password | 

实体框架为我生成以下类:

class Users
{
    public string Username { get; set; }   
    public string Email { get; set; }
    public string Password { get; set; }
}

现在假设我要创建一个注册视图。此注册要求用户确认其密码。我是否像这样展开现有的ET生成类?

class Users
{
    public string Username { get; set; }   
    public string Email { get; set; }
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }
}

或者我自己创建一个完全不同的类,它将包含与ET生成的类分开的所有必要信息?

我是使用ET生成的类创建视图,还是使用自己的类?

我已经看到ViewModels在这里和那里被提及,但我不清楚他们服务的目的是什么。

截至目前,我已经在ET类中手动添加了额外的字段,但它确实有效,但我不知道我做错了还是做对了。

3 个答案:

答案 0 :(得分:4)

您不应触及实体框架生成的代码以满足此类要求。相反,您需要创建一个视图模型,以包含您希望在注册时从用户获取的字段。您可以创建RegisterViewModel。然后,为了比较这些属性,使用Compare属性,完全就像在ASP.NET MVC默认项目模板中使用的那样。然后在控制器中,检查模型状态是否有效,使用已发布的值创建User实体,并在db中保存:

<强>模型

public class RegisterViewModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [StringLength(100, 
    ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", 
    ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

<强>动作

// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new User() { UserName = model.UserName, /*... other fields */ };
        // Save user
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

答案 1 :(得分:0)

不要扩展EF实体。创建新类,当您需要将数据从数据库传输到View时,复制属性(可以使用AutoMapper)。

答案 2 :(得分:0)

说到数据库第一种方法,你永远不应该尝试扩展你的模型,因为它会导致各种奇怪的行为。

尝试从数据库更新模型时遇到的其中一种行为,它会自动删除您手动添加的内容。

我建议您转到答案中提到的ViewModel示例。