2011-12-16 81 views
4

流利的映射和自动映射之间的区别阅读一些有关功能NHibernate的文章,我从哪里开始是什么功能NHibernate

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

那么,什么是FluentMapping?和AutoMapping?

我创建了一个名为classLibraryProject FirstProject.Entities

我创建了一个名为 “客户” 类

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; } 
} 
} 

然后创建一个映射类

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

以下是流利

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

我用流利的断言,像下面

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

流利基本上是你将这些命令链接在一起的地方,因此它读得很好。

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

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

  1. 使用流利指定它究竟应该如何映射。这就像在XML中这样做的标准方式,但与流利的接口。
  2. 使用自动并指定约定将自动将CustomerId更改为分配。
  3. 使用自动并指定一个覆盖,它将使用自动但重写将被分配的CustomerId。

如果你想要做的选项3,这里是代码:

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

功能IsMapped必须要映射实体返回True。

+0

感谢Lain的解释..当你说AutoMap时,Nhibernate是为你创建的数据库表吗?因为我已经有了一个现有的数据库,我只需要通过NHibernate为它创建DataAccess层,因为所有的表都已经创建了Identity Key。你认为选择1适合这种情况吗? – user1096623 2011-12-16 18:28:35