使用一对多关系映射Fluent NHibernate组件

时间:2012-12-29 19:40:55

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我有这些课程:

class A
{
    public virtual Guid Id { get;set; }
    public virtual B Data { get; set; }
}

class B
{
    public IList<byte[]> InnerData1 { get; set; } // (1)
    public IList<C> InnerData2 { get; set; } // (2)
}

class C
{
    public int Value1 { get; set; }
    public int? Value2 { get; set; }
}

并跟随A类的映射:

Id(x => x.Id).GeneratedBy.Guid();
Component(x => x.Data,
    m => 
        {
            m.HasMany(x => x.InnerData1).Element("InnerData1").Not.LazyLoad(); // (1)
            m.HasMany(x => x.InnerData2).Element("InnerData2").Not.LazyLoad(); // (2)
        });

因为设置(1)工作正常,它会自动创建一个表并正确引用它,我有一个问题(2)抛出异常:

Could not determine type for: (...), for columns: NHibernate.Mapping.Column(InnerData1)

为什么它会为IList<byte[]>创建一切正常并且出现问题with IList<C>? 我是否必须为C设置单独的映射?没有其他更简单的方法吗?我不希望在C中为我的模型添加任何额外的ID列。

1 个答案:

答案 0 :(得分:0)

您必须显式映射C,因为它是复合类型(具有多个值的类型)。它不需要具有显式id列

HasMany(x => x.InnerData2)
    .Component(x => 
    {
        x.Map(c => c.Value1, "Value1").Not.Nullable();
        x.Map(c => c.Value2, "Value2");
    })
    .Not.LazyLoad();