如何使用fluent-NHibernate映射没有主键的相关表

时间:2012-06-05 02:44:00

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

对我来说很常见:我有两张桌子: 文件: dID(pk,int),dName(varchar)

和document_options: dID(int),oType(int),oValue(varchar)

我想要一个带有属性Options的类Document(DocumentOption类的List)

由于document_options没有PK我不能使用HasMany,而且这个表中的行看起来不像'真实'实体......

我看到了为文档选项生成自动数字键并使用HasMany进行映射的方法,或者可能创建了一个复合ID,但我想知道是否有更好的选项,我不知道。

2 个答案:

答案 0 :(得分: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();

}

答案 1 :(得分: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

班级FYI:

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; }
}