我有这个表结构,并希望使用Fluent Hibernate(如果可能的子类)映射它。我无法更改结构,因为数据库有太多记录,可能导致主要应用程序返工。如果来自Party表的Id是个人和组织表中的外键会更容易,但在特定情况下,数据库将人员和组织密钥作为聚会表中的外键。任何帮助都会很棒。
标识 PERSONID OrganizationId
标识 FName参数 LName的
标识 ORGNAME OrgDescription
答案 0 :(得分:0)
如果链接表包含除构成复合ID的两个ID之外的任何字段,则无法将链接表映射到自动化。在你的情况下,你的Party表有一个Id字段,它打破了自动化规则,因为它没有很好的设计(即复合id不应该有一个自动递增id,尽管我们这样做是为了索引我工作的地方)。 p>
要解决此问题,您只需为Party创建一个ClassMap,并将Id映射为Id和引用Person and Organization。
然后,在您的Person和Organization实体中,您不是创建一个到Party的HasManyToMany映射,而是为Party实体创建一个HasMany。
实际上,你所做的是明确地将代码与看起来更像是和ERD相匹配,而自动化只有在它只包含复合主键时才通过链接表意味着多对多关系。
这让我难倒了三天,我把这条路当作“黑客”,后来才在几周前在Fluent NHibernate的谷歌小组中读到了这个解释。
我希望有帮助,如果不是,我可以为你抛出一些代码。
另见my post about the same situation。
编辑:
以下是如何看待相当高的水平。请记住,您必须在实体构造函数中初始化集合并创建setter方法。见Getting Started
public class Party {
public virtual int Id { get; set; }
public virtual Person Person { get; set; }
public virtual Organization Organization { get; set; }
}
public class PartyMap : ClassMap<Party> {
public PartyMap() {
Id(x => x.Id);
References(x => x.Person);
References(x => x.Organization);
}
}
public class Person {
public virtual int Id { get; set; }
public virtual string FName { get; set; }
public virtual string LName { get; set; }
public virtual ICollection<Party> Parties { get; set; }
}
public class PersonMap : ClassMap<Person> {
public PersonMap() {
Id(x => x.Id);
Map(x => x.FName);
Map(x => x.LName);
HasMany(x => x.Parties);
}
}
public class Organization {
public virtual int Id { get; set; }
public virtual string OrgName { get; set; }
public virtual string OrgDescription { get; set; }
public virtual ICollection<Party> Parties { get; set; }
}
public class OrganizationMap : ClassMap<Organization> {
public OrganizationMap() {
Id(x => x.Id);
Map(x => x.OrgName);
Map(x => x.OrgDescription);
HasMany(x => x.Parties);
}
}