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>
他们都没有这样的方法。我试着自己实现它,但它不起作用。
以下是我所做的:
-
创建了一个界面"IMySet"
公共接口IMySet:ISet{void AddAll(IEnumerable项);}
-
从"LinkedHashSet"实现复制了完整的源代码,将其重命名为"TestSet"并替换了派生接口。
之前:
public class TestSet<T> : ISet<T>
之后:
public class TestSet<T> : IMySet<T>
不幸的是,这不起作用。如果我试图保存一个实现IMySet的对象,就会出现一个错误:
NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(对象实体,对象[]值)
我不明白出了什么问题。有人能帮忙吗?
正确的解决方案是使用.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)