Fluent NHibernate中的Fluent Mapping和Auto mapping之间有什么区别

时间:2011-12-16 05:40:52

标签: fluent-nhibernate

在阅读了一些关于Fluent NHibernate的文章后,我对从哪里开始感到困惑

我有一个现有的数据库,我需要创建DataAccessLayer。我是NHibernate和FluentNhibernate的新手。由于我理解不需要编写hbm.xml文件,因此我选择了Fluent Nhibernate。

那么,什么是FluentMapping?和AutoMapping?

我创建了一个名为FirstProject.Entities

的classLibraryProject

我创建了一个名为“Customer”的类

namespace FirstProject.Entities
{   
public class Customer
{
    public virtual int CustomerID { get; set; }
    public virtual string CustomerName { get; set; }
    public virtual string Address1 { get; set; }
    public virtual string Address2 { get; set; }
    public virtual string City { get; set; }
    public virtual string State { get; set; }
    public virtual int Zip { get; set; }
}
}

然后我创建了一个Mapping类

namespace FirstProject.Entities
{
public class CusotmerMap : ClassMap<Customer> 
{
    public CustomerMap()
    {
        Id(x => x.CustomerID).Column("CustomerID").GeneratedBy.Assigned();
        Map(x => x.CustomerName);
        Map(x => x.Address1);
        Map(x => x.Address2);
        Map(x => x.City);
        Map(x => x.Zip);           
    }
}
}

我现在不知道如何继续前进。我做得对吗?请建议

如何配置和继续进行

1 个答案:

答案 0 :(得分:1)

以下是Fluent

Id(x => x.CustomerID).Column("CustomerID").GeneratedBy.Assigned();

我使用Fluent断言,如下所示

actual.Should().BeGreaterThan(1).And().LessThan(2);

Fluent基本上是将命令链接在一起的位置,使其读取得非常好。

自动映射是您什么都不做的地方。一切都是通过惯例完成的。我倾向于使用Auto。如果你不遵守惯例,流利是很好的。

根据您的映射,被分配的CustomerId不是开箱即用的约定。因此,你需要

  1. 使用 Fluent 指定应如何映射。这就像在XML中使用标准方式一样,但使用流畅的界面。
  2. 使用自动并指定一个约会,它会自动将CustomerId更改为已分配。
  3. 使用自动并指定覆盖,它将使用自动,但会覆盖CustomerId以进行分配。
  4. 如果你想做选项3,这里是代码:

    var model = AutoMap
        .AssemblyOf<Customer>()
        .Where(IsMapped)
        .Override<Customer>(a => a.Id(b => b.CustomerId, "CustomerId").GeneratedBy.Assigned());
    

    对于要映射的实体,函数IsMapped必须返回True。