我正在测试NHibernate框架的功能,目前我一直在寻找映射集合的集合。映射简单的对象集合时,例如:
public virtual IList<IProduct> SomeProduct { get; set; }
我只是用
HasMany(x => x.Products).Cascade.All();
然后我映射了IProduct
接口。
但是现在,我必须为这个属性实现映射:
private readonly IEnumerable<IReadOnlyList<Guid>> _complicatedEnumerableData;
public IEnumerable<IReadOnlyList<Guid>> ComplicatedEnumerableData
{
get { return _complicatedEnumerableData; }
}
我尝试过类似于标准对象集合的方法,但最终得到的数据库表没有引用IReadOnlyList<Guid>
元素。
关于这个问题:Fluent Nhibernate map list of lists,无法在Fluent NHibernate中映射嵌套集合。
我的问题是 - 是否可以使用标准NHibernate(没有Fluent)?
答案 0 :(得分:1)
您没有指定数据库布局,因此这里有一种方法可以将内部列表存储为值。
HasMany(x => x).Element("somecolumn", e => e.Type<ListOfGuidsUserType>());
和usertype
public class ListOfGuidsUserType : IUserType
{
public int GetHashCode(object x)
{
return ((IEnumerable<Guid>)x).Count();
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var value = (string)NHibernateUtil.String.Get(rs, names[0]);
return value.Split(',').Select(Guid.Parse).ToList();
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
NHibernateUtil.String.Set(cmd, string.Join(",", (IEnumerable<Guid>)value), index);
}
public object DeepCopy(object value)
{
return ((IEnumerable<Guid>)value).ToList();
}
public object Replace(object original, object target, object owner)
{
return DeepCopy(original);
}
public object Assemble(object cached, object owner)
{
return DeepCopy(cached);
}
public object Disassemble(object value)
{
return DeepCopy(value);
}
public SqlType[] SqlTypes
{
get { return SqlTypeFactory.GetString(1000); }
}
public Type ReturnedType
{
get { return typeof(IEnumerable<Guid>); }
}
public bool IsMutable
{
get { return true; }
}
}