C# EF 5数据库首先使用自定义验证

C# EF 5数据库首先使用自定义验证,c#,asp.net-mvc,visual-studio-2010,entity-framework,C#,Asp.net Mvc,Visual Studio 2010,Entity Framework,为了体验Entity Framework的新功能,我创建了一个新的MVC 4 internet应用程序。我将其连接到现有数据库,并使用dbContext生成器生成模型类 通过运行应用程序,我在编辑表单时遇到了一些验证错误。例如,对于DateTime字段,如果插入的日期是“12/10/2012”,而不是2012-10-12(如SQ服务器表示法),则系统会抱怨我试图在项目中找到验证代码,但在生成的代码中找不到 我的一个模型类如下所示: public partial class Artist {

为了体验Entity Framework的新功能,我创建了一个新的MVC 4 internet应用程序。
我将其连接到现有数据库,并使用dbContext生成器生成模型类

通过运行应用程序,我在编辑表单时遇到了一些验证错误。例如,对于DateTime字段,如果插入的日期是“12/10/2012”,而不是2012-10-12(如SQ服务器表示法),则系统会抱怨
我试图在项目中找到验证代码,但在生成的代码中找不到

我的一个模型类如下所示:

public partial class Artist
{
    public Artist()
    {
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public Nullable<System.DateTime> DateOfBirth { get; set; }

    public virtual Countries Countries { get; set; }
}
公共部分类艺术家
{
公共艺术家()
{
}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共可为空的出生日期{get;set;}
公共虚拟国家{get;set;}
}
如果使用数据库优先的方法,如何自定义验证错误
如果我使用验证属性装饰模型,那么一旦再次生成模型类,它们就会被删除

此外,在一个必须使用现有数据库的“真实世界”项目中,开发模型类的最佳方法是什么
通过添加具有相同名称的部分类来扩展自动生成的类

编辑(视图的引入部分):

@使用(Html.BeginForm()){
@Html.ValidationSummary(false)
电影
@LabelFor(model=>model.Name)
@EditorFor(model=>model.Name)
@Html.ValidationMessageFor(model=>model.Name)
@LabelFor(model=>model.DateOfBirth)
@EditorFor(model=>model.DateOfBirth)
@Html.ValidationMessageFor(model=>model.DateOfBirth)

}
嗯,您可以始终使用元数据类

public partial class ArtistMetaData
{
   [Required]
   [StringLength(20)]
   public string Name;//it can be a field instead of a property, must just have the same name and type than in your Model class
}
和一个局部类

[MetadataType(typeof(ArtistMetaData)]
public partial class Artist {
}
或者(我的首选解决方案)您可以使用外部验证库,如


默认情况下,您有一个“基本”验证(可以在global.asax中删除),检查:非nullables值。。。不为null(类似于默认的必需属性),并且值的类型正确。

请检查浏览器和计算机区域性设置,然后检查jquery验证区域性

我倾向于有这个问题,因为我有西班牙语配置,但mvc带有英语日期和货币格式等,例如dd/mm/yyyy和mm/dd/yyyy


您还可以根据需要使用正则表达式属性来验证字段。

您的视图是什么样子的?以MM/DD/YYYY格式输入日期应该没有问题,因为它在发送到SQL Server之前会在.net中转换为日期时间。因此,在你看来,你一定在做一些有点不靠谱的事情。除非您试图以DD/MM/YYYY格式输入日期,否则这是一个全球化问题,是一个完全不同的问题。但是,您给出的示例不应该给出任何验证错误,因为这两种方法都是有效的(虽然如果使用DD/MM/YYYY,显然可能不会给出您想要的结果),您可以使用Fluent API添加验证约束:@millimoose-这些约束只对数据库有效,对MVC验证无效。您使用的是什么日期格式?您确定2012年10月12日会产生错误吗?因为无论哪种方式,它都应该通过验证。现在,像2012年10月15日这样的事情是另一回事。如果你想得到答案,卢卡。。我建议回答人们向您提出的问题,否则有什么意义?+1-我发现元数据类是一个优雅的解决方案。在Global.asax中,我找不到任何有关验证的方法。这是我唯一可以查看的地方吗?@Luca您在Global.asax中没有任何内容,但您可以在
application\u start
中的“隐式”提供程序上明确执行操作,例如,将
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes
属性设置为false(当试图在int属性中设置null时,您不会看到默认消息“Property xxx should not null”,或者类似的消息)我添加了它并将其值设置为false,但消息仍然显示。它与日期格式有关,因为通过以“SQL Server”格式(yyyy-mm-dd)输入它它通过了验证。@Luca是的,这不是同一个问题(AddImplicit…如果您将null设置为不可为null,请给出一条消息)。对于您的问题,您可以看看CustomModelBinder,它可以将日期时间从不同的格式绑定到正确的日期时间。今天我再次运行该项目,并使用jQuery日期选择器处理日期字段,应用程序毫无怨言地接受日期格式。奇怪的是,自从yeste之后,我没有在系统中更改任何内容rday,因此我猜在构建过程中没有设置某些属性/设置。谢谢您的建议!
[MetadataType(typeof(ArtistMetaData)]
public partial class Artist {
}