1

我有这个表结构,并想使用 Fluent Hibernate(如果可能的话,子类)来映射它。我无法更改结构,因为数据库的记录太多,可能会导致主要应用程序返工。如果 Party 表中的 Id 是个人和组织表中的外键会更容易,但在特定情况下,数据库将个人和组织键作为聚会表中的外键。任何帮助都会很棒。

派对桌

Id PersonId 组织Id

人表

Id FName LName

组织表

Id 组织名称 组织描述

4

1 回答 1

0

如果链接表包含构成复合 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);
    }
}
于 2010-04-18T04:20:13.213 回答