【问题标题】:Is there a tool in Visual Studio or plug-in to automate creating buddy class validation?Visual Studio 或插件中是否有自动创建伙伴类验证的工具?
【发布时间】:2010-12-18 06:31:02
【问题描述】:

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

我的问题是

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

编辑 1: 我会添加一些额外的信息。实体数据模型向导很有帮助,因为它基于数据库模式创建模式验证。例如,DinnerId 属性将默认设置为 Int32 以匹配为 int 的列 DinnerID 的类型。

【问题讨论】:

    标签: asp.net visual-studio-2010 entity-framework-4


    【解决方案1】:

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

    【讨论】:

    • 有没有关于如何自定义 .tt 文件的好教程?我不知道要使用这种高级方法。
    • 我脑子里不知道...但是做一些研究会帮助你进一步我猜...并且尝试一下会帮助你学习,我在 T4 中做了一些修改模板也只是通过反复试验并使用我的结构化思维能力;)
    【解决方案2】:

    是的。看起来您正在创建域服务。如果是这种情况,那么当您创建域服务时,可以选择generated associated classes for metadata(窗口底部)。该文件将被称为 yourDomainServiceName.metadata.cs。

    该文件的字段上没有任何注释,因此您必须自己做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      相关资源
      最近更新 更多