如何使用Fluent NHibernate创建映射关系

时间:2011-10-05 00:52:12

标签: nhibernate fluent-nhibernate mapping

如何映射一对多关系 用户地址, 客户致辞, 代理商和地址 使用Fluent NHibernate存储在单个地址表中

public class User
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Address> Address { get; set; }
}
public class Customer
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Address> Address { get; set; }
}
public class Agency
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Address> Address { get; set; }
}
public class Address
{
    public virtual int Id { 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; }
}

3 个答案:

答案 0 :(得分:1)

如果您希望能够为所有类型使用相同的地址,我认为您需要独立存储您的关系以连接地址和用户/客户/代理商。这涉及引入一个仅存储ID对的新表,并将其作为您的关系的存储位置。

您可以将集合映射为多对多,并使用表方法命名您的链接表。您的映射看起来像:

public UserMap : ClassMap<User> {
  Id (u => u.Id);
  Map (u => u.Name);
  HasManyToMany (u => u.Addresses).Table ("UsersXAddresses");
}

您需要为客户和代理商提供类似的链接表。

答案 1 :(得分:1)

在映射类的构造函数中,使用HasMany方法映射链接。 HasMany将创建一对多关系。 HasManyToMany将创建多对多关系。

例如: HasMany(x => x.Address).LazyLoad();

这将在User类和Address类之间创建一对多关系。

对于多对多,您还需要指定表名,如果需要,还需要指定左侧和右侧表映射。

例如: HasManyToMany(x => x.Address).Table("AddressToUser").ParentKeyColumn("AddressId").ChildKeyColumn("UserId").LazyLoad();

如果您决定要区分UserAddressAgencyAddress(这些是地址的子类),您可以使用DiscriminateSubClassesOnColumn方法AddressMap类,因此FNH知道创建一个额外的列以确定要创建的对象类型。

例如: DiscriminateSubClassesOnColumn("Type").AlwaysSelectWithValue();

答案 2 :(得分:1)

您应该可以使用FNH Automapping“按原样”映射这些类。

它将处理所有对象模型中的关系。

我相信它会将所有地址放在一个地址表中,但不能肯定地说。