nhibernate 映射枚举对(键 - 值)

Posted

技术标签:

【中文标题】nhibernate 映射枚举对(键 - 值)【英文标题】:nhibernate mapping enum pair (key - value) 【发布时间】:2013-03-05 06:04:58 【问题描述】:

在我们的系统中,我们使用 nhibernate 将对象映射到数据库中。在我们的一个对象中 我们有字段,它表示为枚举(带有键和值的枚举,f.e.

public enum Status
    
        Draft = 0,
        Archived = 1,
        Imported = 2
       

)

因此,在我们的应用程序中,我们遇到了按枚举表示的字段对对象进行排序的问题:排序不是通过枚举的键,而是按值。为了解决这个问题,我们在数据库中为枚举的字符串键创建了附加字段,并在 nhibenate 模型文件中进行了更改:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <typedef name="StatusName" class="NHibernate.Type.EnumStringType`1[[Code.Model.Status, Code.Model]], NHibernate" />
...
<property name="Status"  type="StatusName" column="StatusName" not-null="true" />
...

更改后排序开始在应用程序中正常工作(记录按枚举键排序),但在数据库中创建新对象后,仅保存枚举键(状态名称字段)和枚举值(状态字段)的值'不保存。

有没有办法通过使用 nhibernate 配置将枚举的键和值映射到数据库列(Status 和 StatusName 列)?

【问题讨论】:

【参考方案1】:

我不确定我是否正确理解了您的问题。它认为您希望将枚举值的名称及其数值存储到数据库中的两个不同列中。

在您这样做之前,请确保您确实想要这样做。这是一种冗余。冗余总是很难保持一致,并且在解决时通常会导致更多问题。

要实现它,你需要编写一个复合custom type,它能够将一个属性的值存储到多个列中。

网上有几个例子,例如。 here 或 here。

【讨论】:

以上是关于nhibernate 映射枚举对(键 - 值)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fluent NHibernate 和 NHibernate 3 将枚举映射为 Int

使用流利的 nhibernate 映射枚举

NHibernate 中的映射表枚举

使用流利的nhibernate映射枚举

如何让 Nhibernate 重建数据库?

无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键