C# 数据库和验证属性中长度不同的字段

C# 数据库和验证属性中长度不同的字段,c#,.net,asp.net-mvc,entity-framework,ef-code-first,C#,.net,Asp.net Mvc,Entity Framework,Ef Code First,因此,我正在编码我的UserAccount模型,它将有一个加密的密码。我首先使用实体框架代码 我现在的问题是,我将在数据库中存储一个加密密码,因此字段密码的长度将与存储在数据库中的长度不同 但若我将StringLength属性设置为20[StringLength(20)],那个么数据库将为20,密码字段将为20 我找不到指定正确数据注释的方法,或者有更好的解决方案吗?在这种情况下,我会使用视图模型 让您的模型实际表示数据库中的内容,并使用您的视图模型添加ui验证以及限制视图实际访问的内容。更好的

因此,我正在编码我的UserAccount模型,它将有一个加密的密码。我首先使用实体框架代码

我现在的问题是,我将在数据库中存储一个加密密码,因此字段密码的长度将与存储在数据库中的长度不同

但若我将StringLength属性设置为20
[StringLength(20)]
,那个么数据库将为20,密码字段将为20


我找不到指定正确数据注释的方法,或者有更好的解决方案吗?

在这种情况下,我会使用视图模型


让您的模型实际表示数据库中的内容,并使用您的视图模型添加ui验证以及限制视图实际访问的内容。

更好的解决方案是将视图模型用于视图,并将模型用于代码优先方法。这样,您的演示文稿就与域模型分开了

我给你举个例子。假设您的自定义登录页面具有
用户名
密码
文本字段,而相应的代码优先模式可能具有以下属性:

-Id
-Username
-Password
-DateOfRegistration
-IsApproved
因此,您不希望在视图中显示所有这些。这就是为什么要创建一个ViewModel,其中只包含与视图相关的属性(即
用户名
密码

域模型(代码优先模型)位于
models/
目录中,其中as-ViewModels通常进入
ViewModels/
目录

您的项目目录结构可能如下所示

App_Start/
Areas/
Content/
Controllers/
    LoginController.cs
Models/
    Users.cs
    ...
Scripts/
Views/
    Login/
    ...
ViewModels/
    Login/
        LoginViewModel.cs
...
public class Users
{
    public int UserId { get; set; }

    [StringLength(30)]
    public string UserName { get; set; }

    [StringLength(20)]
    public string Password { get; set; }

    public DateTime? DateOfRegistration { get; set; }

    public bool IsApproved { get; set; }
}
您的
视图
将被强类型化为ViewModel

可以在ViewModel中应用特定于视图的属性。例如,您的ViewModel可能如下所示。(请注意,ViewModel具有特定于视图的属性,如
必需
显示
等。)

您的代码优先模型可能如下所示

App_Start/
Areas/
Content/
Controllers/
    LoginController.cs
Models/
    Users.cs
    ...
Scripts/
Views/
    Login/
    ...
ViewModels/
    Login/
        LoginViewModel.cs
...
public class Users
{
    public int UserId { get; set; }

    [StringLength(30)]
    public string UserName { get; set; }

    [StringLength(20)]
    public string Password { get; set; }

    public DateTime? DateOfRegistration { get; set; }

    public bool IsApproved { get; set; }
}

我找到了答案。希望它能帮助一些人,这是一个很好的提示,在哪里可以放置这个视图模型?在我的模型文件夹或视图中,它是如何完成的?用示例更新了我的答案。没有足够的声誉来评论Mikhailu的帖子,但我通常创建一个ViewModel文件夹(Mikhailu在他的示例中展示了这一点)。您还可能希望查看AutoMapper,以处理从一个模型到另一个模型的数据获取,反之亦然。