Nhibernate:如何为';设置';

本文关键字:设置 Nhibernate | 更新日期: 2023-09-27 18:20:58

由于我安装了当前版本的Nhibernate(版本4.0.0.4000),因此不再包含Iesi.Collections.Generic.HashedSet。

我在代码的许多部分都使用了这种集合类型,因为它有一个"AddAll"方法,这对我非常有用

然而,现在在同一个命名空间中只剩下3种类型:LinkedHashSet<T>ReadOnlySet<T>SychronizedSet<T>

他们都没有这样的方法。我试着自己实现它,但它不起作用。

以下是我所做的:

  1. 创建了一个界面"IMySet"

    公共接口IMySet:ISet{void AddAll(IEnumerable项);}

  2. 从"LinkedHashSet"实现复制了完整的源代码,将其重命名为"TestSet"并替换了派生接口。

之前:

public class TestSet<T> : ISet<T>

之后:

public class TestSet<T> : IMySet<T>

不幸的是,这不起作用。如果我试图保存一个实现IMySet的对象,就会出现一个错误:

NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(对象实体,对象[]值)

我不明白出了什么问题。有人能帮忙吗?

Nhibernate:如何为';设置';

正确的解决方案是使用.Net的`ISet<T> ':

修改当前集合,使其包含当前集合或指定集合中存在的所有元素。

示例:

ISet<int> set = new Hashset<int>();
set.UnionWith(newElements);

重点是,NHibernate可以/将使用ISet<T>的实现,CCD_5在NHibernat发行版(dll)中可用。很可能是PersistentGenericSet<T>

全新的界面IMySet<T>根本不值得期待。。。不支持。

但这可以通过一些自定义扩展"轻松"解决:

public static class MyExtensions
{
    public static bool AddAll<T>(this ISet<T> list, IEnumerable<T> items)
    {
        // some very simple implementation:
        bool success = true;
        foreach (var item in items)
        {
            success &= list.Add(item);
        }
        return success;
    }
}

然后我们可以像过去一样使用它:

// entity with ISet
public class MyEntity
{
    ...
    public virtual ISet<Employee> Employees { get; set; }
}
// some method adding more items
var myEntity = ...
myEntity.Employees.AddAll(collectionOfEmployees)