值对象映射错误的集合

时间:2015-07-07 09:12:10

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

我尝试在 fluent-Nhibernate C#中映射对象字段,模型包含一个实体,其中包含{{1}的引用字段},

这是实体类

ValueObject

这是值对象类

public class QueryLeaf : Entity
{
    public QueryLeaf()
    {
        FilterDescriptors = new List<FilterDescriptor>();
    }
    public virtual int Id { get; set; }
    public virtual List<FilterDescriptor> FilterDescriptors { get; set; }
}

这是映射类

[Serializable]
public class FilterDescriptor : ValueObject
{
    public FilterOperator FilterOperator { get; set; }//this is an enum value
    public object Value { get; set; }
} 

运行上面的代码时,编译器会在public sealed class QueryLeafMap : ClassMap<QueryLeaf> { public QueryLeafMap() { Id(x => x.Id); HasMany(x => x.FilterDescriptors).Component(com => { com.Map(y => y.FilterOperator); com.Map(y => y.Value); }); } } 页面上停止并给我这个错误

  

集合元素映射的列数错误   QueryLeaf.FilterDescriptors类型:component [FilterOperator,Value]

1 个答案:

答案 0 :(得分:1)

通常,我们可以将{em>参考类型与.References()类型映射为.Map() object 肯定是引用类型,并且会导致此类问题。

事实上,我们无法映射object,它太过于genaral。我们应该创建一些自定义类型(类)或将一般值映射到其序列化,或者如果可能,将映射到字符串值

所以这个小改动会使上面的代码工作:

[Serializable]
public class FilterDescriptor : ValueObject
{
    public FilterOperator FilterOperator { get; set; }//this is an enum value
    // cannot map object
    // public object Value { get; set; }
    public string StringValue { get; set; }
    // and we can do some magic later
    public object Value { get { ... use the StringValue } ... }
} 

因为我们使用了不同的名称,所以这应该是新的映射

HasMany(x => x.FilterDescriptors).Component(com =>
{
    com.Map(y => y.FilterOperator);
    //com.Map(y => y.Value);
    com.Map(y => y.StringValue);
});