如何映射一对多关系 用户地址, 客户致辞, 代理商和地址 使用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; }
}
答案 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();
如果您决定要区分UserAddress
和AgencyAddress
(这些是地址的子类),您可以使用DiscriminateSubClassesOnColumn
方法AddressMap
类,因此FNH知道创建一个额外的列以确定要创建的对象类型。
例如: DiscriminateSubClassesOnColumn("Type").AlwaysSelectWithValue();
答案 2 :(得分:1)