对我来说很常见:我有两张桌子: 文件: dID(pk,int),dName(varchar)
和document_options: dID(int),oType(int),oValue(varchar)
我想要一个带有属性Options的类Document(DocumentOption类的List)
由于document_options没有PK我不能使用HasMany,而且这个表中的行看起来不像'真实'实体......
我看到了为文档选项生成自动数字键并使用HasMany进行映射的方法,或者可能创建了一个复合ID,但我想知道是否有更好的选项,我不知道。
答案 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; }
}