1

对我来说看起来很常见:我有两个表:文档:dID (pk, int), dName(varchar)

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

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

由于 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 回答