【问题标题】:Using EF POCO classes as MVC 2 models (with data annotations)使用 EF POCO 类作为 MVC 2 模型(带有数据注释)
【发布时间】:2010-06-04 19:41:52
【问题描述】:

我有一个用 C# 编写的 4 层 Web 应用程序... .Net 4.0:

  • UI 层
  • 业务层
  • 数据访问层
  • 实体层

我的数据层包含一个 edmx 我的实体层包含我的 POCO 对象(由 t4 脚本生成),并且该层在所有其他层中都被引用。

例如,当创建 MVC 表单以创建新客户时......我的实体层中已经有了包含名字、姓氏等字段的客户类,但自动生成的 POCO 类没有有用于验证的数据注释... I.E. [必填]等提交表单时

我现在的解决方案是创建与我的 poco 类几乎相同但也具有这些额外验证注释的新模型类。

我想知道的是,是否有一种简单的方法可以在 MVC 模型中(在 UI 层中)使用某些 POCO 对象,而无需几乎重写类......并且也无需修改生成这些 POCO 类的 t4 (因为我在 t4 上跟不上)。

我在 stackoverflow 上的另一篇帖子http://automapper.codeplex.com/ 上看到了这一点……不确定这是否可行或是否是最佳解决方案。

【问题讨论】:

    标签: asp.net-mvc validation poco data-annotations n-layer


    【解决方案1】:

    如果你的 POCO 类是这样声明的:

    public class Person {
        public string FirstName { get; set; }
        public string LastName  { get; set; }
    }
    

    如果你只是改变 T4 使其成为一个部分类,你可以在一个单独的文件中定义:

    [MetadataType(typeof(PersonMetadata))]
    public partial class Person {
    
        internal class PersonMetadata {
    
            [Required]
            // insert other metadata here
            public string FirstName { get; set; }
    
            // and if you don't want metadata for lastname, you can leave it out
        }
    }
    

    两个额外点 - 元数据类不必嵌套在您定义的部分中,但我认为它更整洁。此外,元数据类中的类型不必匹配,因此您可以根据需要将它们全部设为对象(您可能会在网络上看到一些这样的示例)

    【讨论】:

    • 这些部分类是否必须放在 UI 层的“模型”文件夹中,或者我可以从我的实体层中引用它们吗?
    • @Chris:这是添加自定义元数据的优雅解决方案。如果您需要像我一样影响方法的主体,但它不起作用(我必须添加 NotifyPropertyChange)。
    【解决方案2】:

    修改 T4 模板一点也不难。我最近遇到了同样的问题,并决定稍微阅读一下 T4,然后修改模板以按照我需要的方式创建生成的属性(注释,在我的情况下使用 NotifyPropertyChange 等,因为我在一个中使用相同的 POCO 对象MVC UI 和 Silverlight UI)。

    即使您正在寻找不需要修改 T4 的解决方案,我希望这很有用。

    【讨论】:

    • 我一直在学习新事物......如果这是一个好的解决方案,那么我会学习它,但我担心的是这些注释是否会影响程序的其他区域不需要它们。
    • @Chris:注释根本不应该影响程序的其他部分。它们只是程序可以选择读取的属性(附加到类/方法/等的元数据)。我能想到的唯一例外是,如果您针对缺少某些方法的有限运行时(例如 Silverlight CLR)。在这种情况下,您可以使用 #if !SILVERLIGHT 对 Silverlight 隐藏这些属性。
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多