FluentNHibernate:如何访问数据类型与属性不同的字段

时间:2010-11-19 09:16:33

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有一个带有'LS_GENDER'字段的数据库,它将性别存储为'M'或'F'。

我的应用程序使用名为Gender的枚举来处理性别。

我的实体具有以下字段和属性:

private string _gender;

public Gender Gender { get { return GetGenderFromString(_gender); } };

private Gender GetGenderFromString(string strGender)
{
  switch (strGender.ToLower())
  {
    case "f":
      return Gender.Female;
    case "m":
      return Gender.Male;
    default:
      return Gender.Unknown;
  }
}

如何使用FluentNHibernate进行映射?我正在尝试使用字段访问(如下所示):

Map(x => x.Gender).Column("LS_GENDER").Access.CamelCaseField(Prefix.Underscore);

但我收到错误'无法将F解析为性别'。我认为NHibernate很混乱,因为属性和字段的类型不同。

我该如何映射?

3 个答案:

答案 0 :(得分:0)

我猜您正在将数据库字符串值(M,F,U)映射到枚举。

此问题的答案可能有助于您将枚举映射到字符串值。

How do you map an enum as an int value with fluent NHibernate? Mapping custom enum classes with Fluent Nhibernate

您可以使用自定义类型将字符串(M,F,U)映射到您所拥有的枚举。

在枚举类中使用自定义属性指定其字符串值。以下文章可以帮助您完成此操作。

http://david.gardiner.net.au/2007/11/using-enum-types-with-nhibernate.html

希望有所帮助。

答案 1 :(得分:0)

令我非常惊讶的是,这种映射有效:

Map(x => x.Gender).Column("LS_GENDER").Access.CamelCaseField(Prefix.Underscore).CustomType(typeof (string));

因此映射表示'直接访问字段并将其视为字符串,即使相应的属性属于Gender'。

答案 2 :(得分:0)

您使用reveal映射私人字段:

Map(Reveal.Member<ClassType>("_gender")).Column("LS_GENDER");

但这并不能解决您的LINQ问题,因为现在NHibernate不知道Gender属性。要解决这两个问题,我将使用实现IUserType的自定义用户类型。