代码之家  ›  专栏  ›  技术社区  ›  Jeff Mc

NHibernate中EnumStringType的规范化

  •  3
  • Jeff Mc  · 技术社区  · 17 年前

    我目前正在使用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映射中,而不是模式中。

    1 回复  |  直到 17 年前
        1
  •  5
  •   Stefan Steinegger    17 年前

    如果我没理解错的话,你的数据库已经完全规范化了。您告诉NHibernate将Enum存储为字符串,这是一件好事。枚举不是实体。它的定义不应该存储在数据库中,因为它是用C#定义的。

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