C# 正确使用实体框架生成的类(DB优先方法)
我正在开发我的第一个MVC5网站,这也是我第一次使用ET 我使用数据库优先的方法 例如,假设这些是Users表中的my字段C# 正确使用实体框架生成的类(DB优先方法),c#,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,我正在开发我的第一个MVC5网站,这也是我第一次使用ET 我使用数据库优先的方法 例如,假设这些是Users表中的my字段 | Username | Email | Password | 实体框架为我生成了以下类: class Users { public string Username { get; set; } public string Email { get; set; } public string Password { get; set; } }
| 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类添加额外的字段,这是可行的,但我不知道我这样做是对是错。不要展开EF实体。创建新类,当您需要将数据从DB传输到视图时,复制属性(您可以使用AutoMapper)。您不应针对此类要求使用实体框架生成的代码。相反,您需要创建一个视图模型,以包含注册时希望从用户处获取的字段。您可以创建一个
RegisterViewModel
。然后,要比较这些属性,请使用attribute,就像ASP.NET MVC默认项目模板中使用的一样。然后在控制器中,检查模型状态是否有效,使用发布的值创建一个User
实体并保存在数据库中:
型号
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);
}
//POST:/Account/Register
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务寄存器(RegisterViewModel模型)
{
if(ModelState.IsValid)
{
var user=new user(){UserName=model.UserName,/*…其他字段*/};
//保存用户
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
}
当谈到数据库优先的方法时,您不应该尝试扩展您的模型,因为它会导致各种奇怪的行为
当您尝试从数据库更新模型时,会遇到其中一种行为,它将自动删除您手动添加的内容
我建议您选择答案中提到的
ViewModel
示例 为什么要为确认密码添加新字段,可以在一个视图上比较两个文本框的值。在POST控制器上比较?在WebForms之类的东西上,我会比较两个文本框值,不确定它在MVC上是如何发生的。您可以创建一个RegisterViewModel
。然后,要比较这些属性,请使用compare
属性,与ASP.NET MVC默认项目模板中使用的属性完全相同。@OverflowStack,是,使用客户端脚本进行比较。@OverflowStack请参阅,谢谢。注册视图将使用RegisterViewModel类作为模板或Users ET类“生成”?是的,在这一行var user=new user(){UserName=model.UserName,/*…other fields*/}代码>发布的代码仅基于ASP.NET默认项目模板生成的代码,您可能需要根据需要应用一些更改。但这是一个很好的示例代码,可以与您分享这个想法,并向您展示正确的方法。非常感谢。最后一个愚蠢的问题。假设我同时拥有RegisterViewModel类和Register控件。我想添加一个新视图。在“添加视图”窗口中,我使用RegisterViewModel作为模型类?属性名称必须与ET类上的名称匹配?不客气。创建模型并构建项目后,您可以在可用模型类列表中看到RegisterViewModel
。