【问题标题】:What happen when DataAnnotation meets EF T4 POCO?当 DataAnnotation 遇到 EF T4 POCO 会发生什么?
【发布时间】:2012-05-28 03:49:06
【问题描述】:

我想要一些使用 EF T4 POCO 生成器生成的模型的建议,并像 MVC 项目中的 /Models 中的普通模型一样利用其中的验证属性。

背景: 我们正在尝试设计一个网络应用程序,2 或 3 名开发人员将致力于它。它采用 Scrum 风格,在构建 Web 应用程序时,我们会定期从客户那里获得需求修改。表、列和关系可能会相应改变。

我们的方法: 我们想使用 EF T4 POCO Generation,因为每次在数据库中添加新表和列时,EF T4 都可以自动更新 POCO 模型。我们希望将这些 POCO 模型用作 MVC 项目的 Model 层(在不同的 Models.dll 中并将其包含到项目中,而不是放在 MVC 项目的 /Models/ 文件夹中)。

问题: 我们想为模型类和属性添加属性。但是,EF T4 将覆盖模型类,我们不能(也不认为我们应该)将这些属性添加到这些模型中。我们不知道什么是正确的方法。

我只能想到在 MVC 项目的包装 ViewModels 中制作属性。它们包含 EF T4 完成的 Models.dll 中的所有必要模型。然后把属性放在前面。但在我看来,击败 DRY 原则很难看。你会怎么做?提前感谢您的想法!

--- 编辑 --- 我确实找到了一个很酷的技巧here 来辅助我的包装想法。但是,我没有提及它,因为我想开放地查看不同的建议并进行比较:)

【问题讨论】:

    标签: asp.net-mvc entity-framework poco t4


    【解决方案1】:

    使用伙伴课程。您的 EF 类是作为部分生成的。创建另一个分部类并使用MetadataType 属性对其进行注释。

    [MetadataType(typeof(FriendMeta))]
    public partial class Friend
    {
    }
    

    然后就可以在好友类的同名属性中添加数据注解属性了。

    public class FriendMeta
    {
        [DisplayName("First Name")]
        public string FirstName { get; set; }
    
        [DisplayName("Last Name")]
        public string LastName { get; set; }
    
        [DisplayName("Date of Birth")]
        public DateTime BrithDate { get; set; }
    }
    

    ASP.NET MVC 元数据提供程序将为您选择这些属性。

    【讨论】:

    • 所以这个伙伴/包装器/元类似乎是要走的路。谢谢:)
    • 使用元数据伙伴类的问题是,如果您使用的是 3 层架构,您可能会将所有 POCO 类放在一个单独的库中。然后伙伴类也需要在这个库中 - 因此,您必须在库中定义您的显示名称字符串,该字符串应该只充当您的业务对象的转储容器。
    • @leo - 你是对的,但我认为这不是 OP 面临的问题。
    • @Jakub:你说的OP是什么意思?
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多