我正在开发我的第一个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类中手动添加了额外的字段,但它确实有效,但我不知道我做错了还是做对了。
答案 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
示例。