我尝试在 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]
答案 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);
});