由于我安装了当前版本的Nhibernate(版本4.0.0.4000),因此不再包含Iesi.Collections.Generic.HashedSet。
我在代码的很多部分使用了这个集合类型,因为它有一个" AddAll"方法,这对我非常有用。
然而 - 现在在同一名称空间中只剩下3种类型:
LinkedHashSet<T>
ReadOnlySet<T>
SychronizedSet<T>
他们都没有这样的方法。 我试图自己实现它,但它不起作用。
这是我做的:
创建了一个界面&#34; IMySet&#34;
public interface IMySet:ISet { void AddAll(IEnumerable items); }
从&#34; LinkedHashSet&#34;复制完整来源实现,将其重命名为&#34; TestSet&#34;并取代派生界面。
之前:
public class TestSet<T> : ISet<T>
之后:
public class TestSet<T> : IMySet<T>
不幸的是,这不起作用。如果我尝试保存实现IMySet的对象,则会发生错误:
NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity,Object [] values)
我不明白这个问题是什么。有人可以帮忙吗?
答案 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)