Nhibernate:如何为'设置'?添加AddAll方法

时间:2014-09-08 10:27:42

标签: c# nhibernate set mapping

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

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

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

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

这是我做的:

  1. 创建了一个界面&#34; IMySet&#34;

    public interface IMySet:ISet {     void AddAll(IEnumerable items); }

  2. 从&#34; LinkedHashSet&#34;复制完整来源实现,将其重命名为&#34; TestSet&#34;并取代派生界面。

  3. 之前:

    public class TestSet<T> : ISet<T>
    

    之后:

    public class TestSet<T> : IMySet<T>
    

    不幸的是,这不起作用。如果我尝试保存实现IMySet的对象,则会发生错误:

    NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity,Object [] values)

    我不明白这个问题是什么。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:6)

正确的解决方案是使用等效的UnionWith() method from .Net's `ISet<T>'

  

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

示例:

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

答案 1 :(得分:1)

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

根本不期望全新的界面IMySet<T> ......不受支持。

但这可能很容易&#34;通过一些自定义扩展解决:

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)