【问题标题】:Using DataAnnotations with Entity Framework将 DataAnnotations 与实体框架一起使用
【发布时间】:2010-06-08 17:59:58
【问题描述】:

我使用 VS2010 的实体框架创建了一个简单的人员类,其中包含属性、名字、姓氏和电子邮件。如果我想像blog post 中那样附加 DataAnnotations,我有一个小问题,因为我的 person 类是动态生成的。我可以直接编辑动态生成的代码,但任何时候我必须更新我的模型,我的所有验证代码都会被删除。

第一直觉是创建一个部分类并尝试附加注释,但它抱怨我正在尝试重新定义属性。我不确定您是否可以像 C++ 中的函数声明一样在 C# 中进行属性声明。如果可以,那可能就是答案。这是我尝试过的sn-p:

namespace PersonWeb.Models
{
  public partial class Person
  {
    [RegularExpression(@"(\w|\.)+@(\w|\.)+", ErrorMessage = "Email is invalid")]
    public string Email { get; set; } 
    /* ERROR: The type 'Person' already contains a definition for 'Email' */
  }
}

【问题讨论】:

  • 我真的很失望你不能定义一个部分类并用你在代码示例中显示的数据注释来装饰它。那是我的第一直觉。然后我看到了这篇文章,没有看到任何对我有吸引力的解决方案。 ef 团队应该提供一个映射机制来规避这种相当烦人的特质。

标签: c# entity-framework validation asp.net-mvc-2


【解决方案1】:

伙伴类或多或少是您的代码 sn-p 的行进方向,除了您手动编码的部分 Person 类将具有内部类,例如:

[MetadataType(typeof(Person.Metadata))]
public partial class Person {
    private sealed class MetaData {
        [RegularExpression(...)]
        public string Email { get; set; }
    }
}

或者您可以手动设置部分 Person 类和一个单独的 Meta 类,例如:

[MetadataType(typeof(PersonMetaData))]
public partial class Person { }

public class PersonMetaData {
[RegularExpression(...)]
public string Email;
}

这些是变通方法,使用映射的 Presentation 类可能更合适。

【讨论】:

【解决方案2】:

您需要使用元数据“伙伴”类或(我的偏好)project onto a presentation model instead of binding views directly to entities

【讨论】:

  • 您能否详细说明您对元数据“伙伴”类的处理方法。如果演示代码和验证有一个关注点分离,我会更喜欢。
  • “我的方法”对“伙伴”课程是不使用它们。就像我说的,我使用演示模型。如果你想要真正的关注点分离,那就是要走的路。
  • 这只是风格问题,我认为所有验证代码和相关元数据都应该单独保留在模型中。您似乎更喜欢将验证代码与演示模型混合。
  • 不,这完全误解了我所说的。属于模型的数据完整性验证与表示模型元数据不同。在 MVC 中,这种区别通过模型中的只读属性和表示中的关联元数据提供者之间的差异来说明。示范规则应自动出现在演示文稿中;只有当特定场景的规则比一般模型更严格时,才需要通过属性手动装饰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 2016-03-09
  • 1970-01-01
相关资源
最近更新 更多