Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正确使用实体框架生成的类(DB优先方法)_C#_Asp.net Mvc_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

C# 正确使用实体框架生成的类(DB优先方法)

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; } }

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

我使用数据库优先的方法

例如,假设这些是Users表中的my字段

| 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