3

我目前在映射如下的 NHibernate 中使用枚举..

public enum UploadMethod
{
    Java, Silverlight, Gears, Flash
}

class UploadMethodType : EnumStringType
{
    public UploadMethodType() : base(typeof(UploadMethod), 255) { }
}

public class Person
{
    /* Bunch of non interesting properties... */
    public UploadMethod PreferredUploadMethod { get; set; }
}

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
 <class name="Person" lazy="false" table="[dbo].[People]">
  <!-- Bunch of non interesting properties... -->
  <property name="PreferredUploadMethod" type="UploadMethodType" />
 </class>
</hibernate-mapping>

除了数据库远未标准化之外,它工作得很好,People 表中的每一行都有一个包含四个文本字符串之一的列。我现在已经把它分成了一个新表,但我不确定如何在 NHibernate 中创建映射。我的第一直觉只是,<many-to-one>但我不希望这个枚举成为它自己的实体,我基本上只需要 NHibernate 做一个简单的连接来附加额外的列。

作为权宜之计,我刚刚创建了一个工作正常的视图,但我宁愿抽象层位于我的 NHibernate 映射中,而不是模式中。

4

1 回答 1

5

如果我理解正确,那么您的数据库已完美规范化。您告诉 NHibernate 将 Enum 存储为字符串,这是一件好事。枚举不是实体。它的定义不应该存储在数据库中,因为它是在 C# 中定义的。

如果删除 EnumStringType 并将枚举映射为 Int32,则将其作为数字获取。这对您来说可能看起来更“规范化”,但是当您更改枚举并且必须处理遗留数据库时,这是一个潜在的问题。

于 2008-12-22T22:41:45.920 回答