1

このテーブル構造があり、Fluent Hibernate (可能であればサブクラス) を使用してマップしたいと考えています。データベースのレコードが多すぎて、主要なアプリケーションの再作業が発生する可能性があるため、構造を変更できません。Party テーブルの Id が個人および組織テーブルの外部キーである場合は簡単ですが、特定のシナリオでは、データベースは個人および組織キーを外部キーとして party テーブルに持っています。どんな助けでも素晴らしいでしょう。

パーティーテーブル

個人ID 組織ID

人物表

Id FName LName

組織表

ID 組織名 組織の説明

4

1 に答える 1

0

複合IDを構成する2つのID以外のフィールドが含まれている場合、リンクテーブルを自動マッピングでマップすることはできません。あなたの場合、Partyテーブルには、適切に設計されていないために自動マッピングルールに違反するIdフィールドがあります(つまり、複合IDには自動インクリメントIDを含めるべきではありませんが、これは私が作業する場所のインデックス作成のために行います)。

これを修正するには、PartyのClassMapを作成し、IdをIDとしてマップし、PersonとOrganizationを参照する必要があります。

次に、PersonエンティティとOrganizationエンティティで、PartyへのHasManyToManyマッピングを作成する代わりに、PartyエンティティへのHasManyを作成します。

実際、あなたがしていることは、コードを明示的に一致させてERDのように見せることですが、自動マッピングは、複合主キーのみが含まれている場合にのみ、リンクテーブルを介した多対多の関係を意味します。

これは私を3日間困惑させ、私はこのルートを「ハック」としてとらえましたが、数週間前にFluentNHibernateのグーグルグループでこの説明を後で読んだだけでした。

それがお役に立てば幸いです。そうでない場合は、コードをまとめてください。

同じ状況についての私の投稿も参照してください。

編集:

これがかなり高いレベルでどのように見えるかを示します。エンティティコンストラクターでコレクションを初期化し、セッターメソッドを作成する必要があることを忘れないでください。はじめにを参照してください

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 に答える