斯科特·汉塞尔曼(Scott Hanselman)的书向我介绍了如何创建NerdDinner MVC应用程序。

为了验证由实体数据模型向导生成的实体类型Dinner,他首先通过使用部分类技巧扩展了实体Dinner,然后使一个伙伴类与Dinner相关联。

有关详细信息,请参见以下代码。

using System.ComponentModel.DataAnnotations;

namespace NerdDinner.Models
{
    [MetadataType(typeof(DinnerValidation))]
    public partial class Dinner { }

    public class DinnerValidation
    {
        [Required(ErrorMessage = "Title is required")]
        [StringLength(50, ErrorMessage = "Title may not be longer than 50 characters")]
        public string Title { get; set; }

        [Required(ErrorMessage = "Description is required")]
        [StringLength(256, ErrorMessage = "Description may not be longer than 256 characters")]
        public string Description { get; set; }

        [Required(ErrorMessage = "Addresss is required")]
        public string Address { get; set; }

        [Required(ErrorMessage = "Country is required")]
        public string Country { get; set; }

        [Required(ErrorMessage = "Contact phone is required")]
        public string ContactPhone { get; set; }
    }
}

我的问题是

有没有一种“便捷的”方式来创建伙伴类并将其与Dinner相关联?我的意思是我们可以使用Visual Studio中的工具或任何插件来创建好友类,并将好友与Dinner自动关联。当然,我应该对生成的代码进行一些调整以满足我的需要,但这不是一个大问题。

编辑1:
我将添加一些其他信息。实体数据模型向导很有用,因为它基于数据库架构创建架构验证。例如,默认情况下,DinnerId属性将设置为Int32,以匹配DinnerDateID列的类型。

最佳答案

使用实体数据模型向导是不可能的。但是您可以做的是扩展Generator(生成实体的.tt文件),并让其添加[MetadataType(typeof( Validation))]。这样,所有生成的实体都已经准备好进行伙伴分类了……那么,您不必建立单独的局部类即可建立关联。接下来,您可以手工创建伙伴类,或者最终在“Microsoft”生成的实体旁边生成它们,这些实体是单独的文件或所有伙伴类在一起的一个文件。我们使用与您在自我跟踪实体中描述的方法相同的方法。首先,它只是一点点工作。但这确实值得。因为您获得了可以在任何给定点进行验证的坚如磐石的类:客户端,服务层,业务访问层等,所以还必须从数据库中设置所有验证条件。我们已经研究了从.edmx生成此内容的方法,但是发现为30多个类手动指定它们更具吸引力。需要几个小时的工作,但是之后是放映时间! ;)在自动生成的验证标准下,可能比生成的伙伴类更难维护,但是到处都是权衡(花费几天/周来扩展标准模板)。祝好运!

10-07 17:44