使用自动映射时如何使用 Fluent NHibernate Validator?

Posted

技术标签:

【中文标题】使用自动映射时如何使用 Fluent NHibernate Validator?【英文标题】:How to use Fluent NHibernate Validator when using auto mapping? 【发布时间】:2012-05-29 19:45:39 【问题描述】:

我刚刚使用 Fluent nHibernate 和自动映射功能对一个小型数据库进行了建模。现在我想知道我如何使用验证。在过去,我用属性装饰了我的类,但这种按惯例自动映射的目的是保持事物清洁。

我确实有几个看起来像这样的覆盖文件:

public class EventMappingOverride : IAutoMappingOverride<Event>

    public void Override(AutoMapping<Event> mapping)
    
        mapping.Map(x => x.EventType, "TypeID").CustomType(typeof(EventType));
        mapping.Map(x => x.EventStatus, "StatusID").CustomType(typeof(EventStatus));
        mapping.HasMany(x => x.EventDates).KeyColumn("EventID");
    

这是我放置验证规则的地方吗?如果是这样,那是什么样的?使用自动映射真的有什么意义吗(如果我的覆盖文件无论如何都要详细说明的话)?

谢谢。

进一步澄清:

我的实体现在看起来像这样:

namespace Business.Data

       public class Event
       
            public virtual int Id  get; set; 
            public virtual string Title  get; set; 
            public virtual EventStatus EventStatus  get; set; 
            public virtual EventType EventType  get; set; 
            public virtual IList<EventDate> EventDates  get; set; 
       

我想让它们看起来像这样。只是简单的对象,因此将来我们可以切换或升级 ORM 并仍然拥有这些漂亮干净的对象。

但是,当谈到使用nHibernate Validator(NHContrib 的一部分)时,我不确定如何在不乱扔属性的情况下合并它。我想这更像是一个问题架构。我也可以使用不同的验证框架,但我希望它与 nHibernate 绑定,这样它就不会插入/更新无效记录。任何意见表示赞赏!

【问题讨论】:

验证规则是什么意思?你有一个例子吗?我在未经验证的项目中使用了与您相同的方法,因为我真的不了解目的吗?如果您想清楚这一点,我可以为您提供更多帮助 我想我只是在问像这样的设置结合 nHibernate Validator 的“最干净”的方法是什么。这篇文章 [link]marekblotny.blogspot.ca/2009/03/… 展示了如何,但最终你拥有装饰你的对象的属性。也许这是目前最好的方法?我想省略属性并在其他地方指定验证规则。 我现在明白了,我的意见是你不应该使用它并在提交到数据库之前验证自己。由于这种方法只是将错误抛出到上面而已。如果已经有验证,这实际上取决于您使用的项目,只需跳过此即可。如果不是,那么可以使用它,但无论如何这不是你应该设置它的地方。属性应该在您的域上,并且验证器设置在您设置所有约定的同一位置。阅读本文以获取更多信息。nhforge.org/wikis/validator/… 谢谢。我刚刚添加到我的问题:“我也可以使用不同的验证框架,但我希望它与 nHibernate 绑定,这样它就不会插入/更新无效记录。”我真的很想将验证正确地绑定到 nHibernate。 阅读我的编辑,域 = 实体。检查我的链接配置部分 【参考方案1】:

我的看法是:

验证是业务的一部分,它依赖于它,然后数据库扩展到此需求。因此,如果您需要数据库中的电子邮件字符串列,则不应依赖数据库框架来执行此操作,尤其是正如您所说,可能稍后您将切换 ORM,然后您将失去工作。

在业务/高层保持验证,让数据库做简单的查询/插入,记住 NHibernate 已经有点复杂了,所以保持简单。

要回答您的问题,如果您不想乱扔您的实体,请使用此处描述的 xml 验证。

http://nhforge.org/wikis/validator/nhibernate-validator-1-0-0-documentation.aspx

【讨论】:

感谢您的帮助。我喜欢你的观点。我不是 XML 验证的忠实拥护者,所以也许我会改用 Fluent Validation (fluentvalidation.codeplex.com)。这基本上会做我想做的事,但不会直接与 nHibernate 绑定(你说服我这可能是件好事)。我会尽快接受您的回答,但我想给其他人时间来回答。 别担心,只是好奇,你在做什么样的应用程序? MVC?网络表格? WPF ? WCF ? 好问题。我正在使用 MVC 3。它是一个 Web 应用程序。所以我想要可靠的业务级验证,我可以将其作为验证消息传递给客户端。 然后使用 MVC 验证,它坚如磐石,非常好,把它放在哪里将是你的下一个问题,因为它也是属性,答案将在 ViewModel 上,因为你想要验证一个看法。你所有的视图都应该是强类型的,总是,总是。那是最好的地方,还有一些不错的扩展,比如dataannotationsextensions.org,可能还有更多。请记住,使用 jquery unobstructive(每个字段上的数据属性)进行 javascript 验证也是如此,您可以创建自己的,因此将它们保留用于其他项目。 asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-6 忘记 Model,我讨厌这个名字它与 db Model 冲突,我更喜欢 ViewModel。

以上是关于使用自动映射时如何使用 Fluent NHibernate Validator?的主要内容,如果未能解决你的问题,请参考以下文章

Fluent NHibernate 多对多映射,使用自动生成的 pk 而不是复合键

Fluent NHibernate 自动映射:一对多实体,多对多后端?

如何使用 Fluent API 映射这种冗余的父子关系

如何让 Web API odatamodelbuilder 使用 EF fluent API 映射

如何在Fluent NHibernate中映射受保护的集合?

使用 Fluent NHibernate 映射泛型类