1

私には一般的な状況に見えます: 私は2つのテーブルを持っています: ドキュメント: dID (pk, int), dName(varchar)

および document_options: dID (int)、oType(int)、oValue(varchar)

プロパティ Options (DocumentOption クラスのリスト) を持つクラス Document が必要です。

document_options には PK がないため、HasMany を使用できず、このテーブルの行はとにかく「実際の」エンティティのようには見えません...

ドキュメント オプションの自動付番キーを生成し、HasMany でマップする方法、または複合 ID を作成する方法を見つけましたが、私が知らないより良いオプションがあるかどうか知りたいです。

4

2 に答える 2

2

この場合、DocumentOptionsは値オブジェクトです。これは、それ自体のアイデンティティがなく、それが属するドキュメントの外では意味を持たないためです。したがって、Componentコレクション プロパティを値オブジェクトにマップするために使用します。

public class Document : Entity // don't worry about Entity; it's a base type I created that contains the Id property
{
    public virtual string Name { get; set; }

    public virtual IList<DocumentOptions> Options { get; protected set; }

    public Document()
    {
        Options = new List<DocumentOptions>();
    }
}

public class DocumentOptions
{
    public virtual int Type { get; set; }

    public virtual string Value { get; set; }
}

そしてマッピング:

public DocumentMap()
{
    Table("documents");

    Id(c => c.Id)
        .Column("dId")
        .GeneratedBy.HiLo("10");

    Map(c => c.Name)
        .Column("dName");

    HasMany(c => c.Options)
        .Component(c =>
                       {
                           c.Map(c2 => c2.Value).Column("oValue");
                           c.Map(c2 => c2.Type).Column("oType");
                       })
        .Table("document_options")
        .KeyColumn("dId")
        .Cascade.AllDeleteOrphan();

}
于 2012-06-05T04:06:17.130 に答える
0

私が正しく理解していれば、オプションをコンポーネントのリストとしてマップする必要がありました:

HasMany(x => x.DocumentOptions)
    .Table("document_options")
    .KeyColumn("dID")
    .Component(c => {
            c.Map(x => x.Option, "oID");
            c.Map(x => x.Value, "oValue");
    })
    .Fetch.Subselect(); //This type of join isn't strictly needed, is used for SQL optimization

クラス 参考までに:

public class Options {
    public virtual int Option { get; set; }
    public virtual int Value { get; set; }
}

public class Document {
    public virtual int ID { get; set; }
    public virtual String Name { get; set; }
    public virtual IList<DocumentOption> DocumentOptions { get; set; }
}
于 2012-06-05T04:10:21.167 に答える