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) ?

NHibernate嵌套集合

您没有指定数据库布局,因此这里有一种方法可以将内部列表存储为值。

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