【问题标题】:Storing a Set of Integer values in Sql Server 2005 with nHibernate?使用 nHibernate 在 Sql Server 2005 中存储一组整数值?
【发布时间】:2011-03-09 13:47:18
【问题描述】:

存储和映射包含一组整数作为其属性之一的实体的最佳方法是什么?我在 Sql Server 2005 上使用 nHibernate。

创建 CLR 自定义类型会有所帮助吗?如果是,如何使用 nHibernate 进行映射?

我应该可以在 Set 上查询。例如

select myEntity from MyEntities where myEntity.Integers = SetOf(2, 4, 5)

【问题讨论】:

  • “它的一个属性”:你是指字段还是属性? “CLR 自定义类型”是什么意思?
  • @Stefan:我的意思是属性。 CLR 内置在 Sql Server 2005 中,我们可以创建自定义类型
  • 当你使用NHibernate时,我一般会坚持NHibernate的特性,这样可以让你更加独立于Sql Server,降低开发成本。 NHibernate 有一些用户类型,但这里没有使用它们。这个问题对我来说听起来很基础,除非我错过了什么。 编辑:在对我的问题的评论中,我看到您需要特定的查询。将它们添加到问题中,是必不可少的。
  • Set 中的所有项目都应该匹配吗?所以集合应该包含完全相同的项目?根据定义,集合是无序的,因此顺序无关紧要。
  • 是的,顺序无关紧要,所有项目都必须匹配。

标签: sql-server nhibernate hibernate nhibernate-mapping


【解决方案1】:

假设这个类

class MyEntity
{
  //...
  public IList<int> Integers { get; private set; }
}

只需将其映射为一组即可。

<class name="MyEntity">
  <!-- ... -->
  <set name="Integers" table="MyEntity_Integers">
    <key column="MyEntity_FK"/>
    <element type="Int32" column="Value"/>
  </set>
</class>

您可以尝试通过以下方式过滤集合:

from MyEntity e 
where e.Integers in (:set) 
  and size(e.Integers) = :setSize

这可能不是很快。


一种完全不同的方法:将整数以某种序列化形式存储到单个文本字段中。

您可以编写自己的 NHibernate 自定义类型。在存储之前对整数进行排序。您可以将它们存储为"2;45;78;898" 之类的格式。过滤会非常快,因为它只匹配字符串。更改数据库中的集合可能会很困难。另一个问题是列的长度是有限的。

Here is an example 的 NHibernate 用户类型实现。

【讨论】:

  • 这是其中一种方式,但我还需要能够在 Set 上进行查询。就像 MyEntity.Integers == SetOf(2,3,5)
  • 这是一个不同的问题。您无法为任何查询制作最佳映射。您需要告诉我您需要对这些数据结构执行哪种查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多