我有这个表结构,并想使用 Fluent Hibernate(如果可能的话,子类)来映射它。我无法更改结构,因为数据库的记录太多,可能会导致主要应用程序返工。如果 Party 表中的 Id 是个人和组织表中的外键会更容易,但在特定情况下,数据库将个人和组织键作为聚会表中的外键。任何帮助都会很棒。
派对桌
Id PersonId 组织Id
人表
Id FName LName
组织表
Id 组织名称 组织描述
我有这个表结构,并想使用 Fluent Hibernate(如果可能的话,子类)来映射它。我无法更改结构,因为数据库的记录太多,可能会导致主要应用程序返工。如果 Party 表中的 Id 是个人和组织表中的外键会更容易,但在特定情况下,数据库将个人和组织键作为聚会表中的外键。任何帮助都会很棒。
Id PersonId 组织Id
Id FName LName
Id 组织名称 组织描述
如果链接表包含构成复合 id 的两个 id 以外的任何字段,则无法使用自动映射映射链接表。在您的情况下,您的 Party 表有一个 Id 字段,它违反了自动映射规则,因为它的设计不完善(即复合 id 不应该有一个自动递增的 id,尽管我们这样做是为了在我工作的地方建立索引)。
要解决此问题,您只需为 Party 创建一个 ClassMap,并将 Id 映射为 Id 并引用 Person 和 Organization。
然后,在您的 Person 和 Organization 实体中,您将创建一个到 Party 实体的 HasMany,而不是创建到 Party 的 HasManyToMany 映射。
实际上,您所做的是显式匹配代码以使其看起来更像 ERD,而自动映射仅在仅包含复合主键时才通过链接表暗示多对多关系。
这让我困扰了三天,我把这条路线当作“黑客”,只是后来几周前在 Fluent NHibernate 的谷歌小组中读到了这个解释。
我希望这会有所帮助,如果没有,我可以为您整理一些代码。
另请参阅我关于相同情况的帖子。
编辑:
这是一个相当高的水平。请记住,您必须在实体构造函数中初始化集合并创建 setter 方法。请参阅入门
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);
}
}