NHibernate.Mapping.ByCode.Conformist.ClassMapping和FluentNHib

本文关键字:FluentNHib ClassMapping Conformist Mapping ByCode NHibernate | 更新日期: 2023-09-27 18:04:18

我正在学习NHibernate,其中的类映射,我知道,是用XML完成的。我知道Fluent NHibernate是作为xml风格的映射的强类型替代品而出现的。事实上,以下是fluent-nhibernate标签的描述:

Fluent NHibernate允许你用强类型编写NHibernate映射c#代码。这允许容易的重构,提高可读性和更简洁的代码。

后来我使用NHibernate Mapping Generator从我现有的数据库中创建映射和域类,它生成的映射代码如下:

using NHibernate.Mapping.ByCode.Conformist;
using NHibernate.Mapping.ByCode;
namespace MyNamespace.Infrastructure.Mappings
{
    public class MyItemMapping  : ClassMapping<MyItem> 
    {
        public MyItemMapping()
        {
            Table("MyItems");
            Schema("master");
            Lazy(true);
            Id(x => x.ID, map => map.Generator(Generators.Assigned));
            Property(x => x.Status, map => map.NotNullable(true));
            Property(x => x.DueDate, map => map.NotNullable(true));
            Property(x => x.NextReminderDate);
            Property(x => x.DatePaid);
            Property(x => x.Notes);
        }
    }
}

瞧,它正在使用NHibernate.Mapping.ByCode.Conformist.ClassMapping<T>类。到底发生了什么事?如果NHibernate实际上有它自己的强类型,非xml映射能力,那么我为什么需要流利的NHibernate?

我注意到NHibernate.Mapping.ByCode.Conformist.ClassMapping<T>FluentNHibernate.Mapping.ClassMap<T>之间存在一些差异。例如,前者不支持References(例如References(x => x.BillingItemID);)通过外键来关联实体。也许还有别的方法

NHibernate.Mapping.ByCode.Conformist.ClassMapping和FluentNHib

在NHibernate有MappingByCode之前,FluentNHibernate就存在了,现在它有了,FluentNHibernate已经过时了,它也比NHibernate自己的MappingByCode效率低,因为它在启动时生成普通的XML映射文件并在内部使用它们。

NHibernate MappingByCode唯一的缺点是没有太多的文档,我发现最好的是在这里:

http://notherdev.blogspot.co.uk/2012/02/nhibernates-mapping-by-code-summary.html

但我还是会使用NHibernate的版本。我的印象是NHibernate的版本实际上比FluentNhibernate支持的更多,等价的Reference只是关系的对立面,例如,如果父端映射为OneToMany(),那么等价的子端映射到Fluent的Reference将是ManyToOne()