其他分享
首页 > 其他分享> > CodeGo.net>规范化NHibernate中的EnumStringType

CodeGo.net>规范化NHibernate中的EnumStringType

作者:互联网

我目前在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中创建映射.我的第一个直觉就是<多对一个>但是我不希望这个枚举成为它自己的实体,我基本上只需要NHibernate做一个简单的联接来添加额外的列.

作为一个捷径,我刚刚创建了一个视图,该视图可以正常工作,但我希望抽象层位于我的NHibernate映射中,而不是架构中.

解决方法:

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

如果删除EnumStringType并将枚举映射为Int32,则会以数字形式获取它.对于您来说,这可能看起来更“规范化”,但是当您更改枚举并不得不处理旧数据库时,这是一个潜在的问题.

标签:nhibernate,nhibernate-mapping,c
来源: https://codeday.me/bug/20191024/1921833.html