NHibernate嵌套集合
本文关键字:集合 嵌套 NHibernate | 更新日期: 2023-09-27 18:06:36
我正在测试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映射列表的列表,在Fluent Nhibernate中不可能映射嵌套集合。
我的问题是-是否有可能使用标准的NHibernate(没有Fluent) ?
您没有指定数据库布局,因此这里有一种方法可以将内部列表存储为值。
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; }
}
}