集合值对象映射错误

collection of value object mapping error

我正在尝试在 fluent-NhibernateC# 中映射对象字段,该模型包含一个具有引用字段的实体ValueObject,

这是实体class

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

这是值对象class

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

这是映射 class

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

当 运行 上面的代码编译器在 global.asax 页面停止并给我这个错误

collection element mapping has wrong number of columns QueryLeaf.FilterDescriptors type: component[FilterOperator,Value]

一般来说,我们可以将 Reference 类型映射到 .References(),将 Value 类型映射到 .Map()object 肯定是引用类型,并且会导致此类问题。

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

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

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