MVC3结合Entity Framework Model/Database First进行验证。

9

我想在我的应用程序中使用MVC 3和Entity Framework。

模型将存储在不同的程序集中,而非MVC应用程序中。

我要做的选择是使用EF生成我的实体或使用Code First。

如果使用Code First,我可以使用[Required]等装饰成员。但是,如果EF从数据库生成实体,我该如何添加这些属性?

使用EF生成我的实体将节省很多时间,但我希望MVC可以根据我已经装饰过的成员自动填充验证。这有意义吗?如果是这样,我该怎么做呢?

3个回答

11

在这种情况下,可以使用MetadataTypeAttribute。您可以将其与部分类组合以实现所需的结果。

顺便说一下,在您决定使用数据库优先(Database First)和代码优先(Code First)设计之间时,我建议您进行更多的研究。这不仅仅是为了节省生成实体的时间,在这两种方法之间还有很大的差异。为了节省时间,您可以使用EF Power Tools从数据库生成代码嵌入式实体,非常简单。


谢谢,当我这样做时,我会得到模糊名称错误。这是我在部分类中的代码(实体在模型中称为Item): - Paul
[MetadataType(typeof(Item))] public partial class Item { [StringLength(10), Required] public string MaterialName { get; set; } } - Paul
保罗,这种歧义可能与现有的 edmx ef 文件有关吗? - jim tollan
通常,元数据类的命名约定为[类名]Metadata。对于Item实体,其元数据的良好命名应为ItemMetadata。尝试这样做以避免模糊的名称冲突。 - archil
请记住,部分视图必须驻留在同一程序集中,因此在这种情况下,应该位于 EDMX 项目而不是 MVC 项目中。 - Spooles
显示剩余4条评论

2
比起自动生成实体,我建议你使用Code First或将现有数据库映射到POCO类(不是生成实体,而是手动创建它们并将它们映射到现有数据库)。
Scottgu在使用EF“Code First”与现有数据库中写到。

1

看这个: 在您的模型模板(扩展名为model.tt的文件)中,您可以修改此模板以生成装饰器,在此示例中,我添加了[Required]装饰器以及一个错误消息

var simpleProperties = typeMapper.GetSimpleProperties(entity);
if (simpleProperties.Any())
{
    foreach (var edmProperty in simpleProperties)
    {
        if(!edmProperty.Nullable)
        {#>
[Required(ErrorMessage="<#=String.Format("The field {0} is required",edmProperty.ToString())#>")]<#
        }#>
<#=codeStringGenerator.Property(edmProperty)#><#
    }
}

因此,结果类似于这样:

所以结果是这样的

    [Required(ErrorMessage="The field Id is required")]
    public long Id { get; set; }

PS:您也可以通过编辑模板添加using System.ComponentModel.DataAnnotations;

希望这能帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接