【问题标题】:Nhibernate: how to add AddAll method for 'Sets'?Nhibernate:如何为“Sets”添加 AddAll 方法?
【发布时间】:2014-11-01 13:11:05
【问题描述】:

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

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

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

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

这是我所做的:

  1. 创建了一个接口“IMySet”

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

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

之前:

public class TestSet<T> : ISet<T>

之后:

public class TestSet<T> : IMySet<T>

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

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

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

【问题讨论】:

    标签: c# nhibernate set mapping


    【解决方案1】:

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

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

    例子:

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

    【讨论】:

      【解决方案2】:

      关键是,NHibernate 可以/将使用 ISet&lt;T&gt; 的实现 - 它在 NHibernate 分发版中可用(dll)。很可能是PersistentGenericSet&lt;T&gt;

      全新的界面 IMySet&lt;T&gt; 根本不符合预期...不支持。

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

      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)
      

      【讨论】:

      • 这太棒了!非常感谢。但是..我不明白。为什么它有效?我以前从未见过以这种方式使用静态类。您能告诉我在哪里可以找到有关此技术的更多信息吗?
      • 这称为"Extension methods"。它确实提高了阅读能力,而事实上 - 它只是我们开发人员的语法糖......享受它们和 NHibernate ;)
      • 再次感谢您。那个“糖”很棒——我真的很想知道为什么我以前从未听说过。对于所有其他读者:这是一个简单的教程:weblogs.asp.net/scottgu/…你帮了我很多。竖起大拇指;)
      • 集合类型的解释是正确的,但不需要实现。这已作为 ISet.UnionWith() 提供。
      猜你喜欢
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多