我有一个有趣的问题,我似乎找不到令人满意的答案。它涉及连接表。
基本上(我确定这已经以某种形式出现在这里,但我找不到)我有3张桌子。 Person表,地址表,PersonAddress ..
是PersonID 名称 年龄 等。
AddressID
AddressLine1
AddressLine2
市
国家
拉链
AddressID
是PersonID
地址类型
AddressType在联接表上的原因很简单,因为这些地址可以在整个公司的人员之间共享,如运输类型,物理位置或结算。
甚至可能将这些作为集合或其他东西加入
我想管理类似这样的事情
AddressLine1
AddressLine2
市
国家
邮编
地址类型
名称
年龄
IListAddresses
此人将为自己持有一系列地址。
如果有人能用Fluent或直接XML映射完成此任务,那就太棒了。我觉得这应该很简单,但我很想念它。并没有正确的语言(桥牌表,连接表,收集表,连接部分表)我似乎不能谷歌来拯救我的生命。
提前感谢任何帮助!
答案 0 :(得分:1)
我认为如果我理解正确的话,这很容易实现。 :)你有一个Person对象,你希望它包含一些属性和一个人的地址集合,也可以在其他用户之间共享,对吗?好吧,要使用Fluent NHibernate设置它,我会做这样的事情:
// Person Entity
public class Person
{
public int Id { get; private set; }
public string Name { get; set; }
public IList<PersonAddress> Addresses { get; set; }
}
// Fluent Mapping
public class PersonMap : ClassMap<Person>
{
public PersonMap() {
Id(x => x.Id);
Map(x => x.Name);
HasMany(x => x.Addresses).Cascade.All();
}
}
// Address Entity
public class Address
{
public int Id { get; private set; }
public string Address1 { get; set; }
public string City { get; set; }
public IList<PersonAddress> People { get; set; }
}
// Fluent Mapping
public class AddressMap : ClassMap<Address>
{
public AddressMap() {
Id(x => x.Id);
Map(x => x.Address1);
Map(x => x.City);
HasMany(x => x.People).Cascade.All();
}
}
// PersonAddress Entity
public class PersonAddress
{
public int Id { get; private set; }
public Person Person { get; set; }
public Address Address { get; set; }
public AddressType Type { get; set; }
}
// Fluent Mapping
public class PersonAddressMap : ClassMap<PersonAddress>
{
public PersonAddressMap() {
Id(x => x.Id);
References(x => x.Person);
References(x => x.Address);
Map(x => x.Type).CustomTypeIs(typeof(AddressType));
}
}
基本上,这允许Person拥有一组地址,并且这些地址可以在公司(多人)之间共享。您几乎拥有多对多设置,但由于您在PersonAddress中存储状态信息,因此它在Person和Address Entity中成为两个一对多关系。
对不起,如果我给你超过你想要的!只是觉得打字! :P
请告诉我这是否有帮助,或者如果您有任何疑问,或者我完全偏离基础。
答案 1 :(得分:1)
我会将AddressType移离PersonAddress表并将其放在地址表中。然后,您应该能够映射常规的多对多映射。
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Id(x => x.PersonId);
Map(x => x.Name);
HasManyToMany(x => x.Addresses)
.Cascade.All()
.WithTableName("PersonAddress");
}
}
答案 2 :(得分:0)
您可以设置一个连接Person和PersonAddress表的数据库视图。然后可以创建一个包含AddressType的nHibernate Address对象,即使在您拥有所需的表结构的情况下也是如此。