NHibernate嵌套集合

时间:2015-08-05 17:13:13

标签: c# nhibernate collections

我正在测试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)?

1 个答案:

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