代码之家  ›  专栏  ›  技术社区  ›  David

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

  •  0
  • David  · 技术社区  · 14 年前

    我有一个数据库,其中有一个字段“ls-gender”,它将性别存储为“m”或“f”。

    我的应用程序使用一个名为gender的枚举来处理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;
      }
    }
    

    如何将此与FluentHibernate映射?我正在尝试使用字段访问(如下所示):

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

    但我得到了一个错误“不能将f解析为性别”。我认为NHibernate正在被混淆,因为属性和字段不是同一类型。

    我应该如何映射这个?

    3 回复  |  直到 14 年前
        1
  •  0
  •   Jamie Ide    14 年前

    您可以使用映射私有字段 reveal :

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

    但这并不能解决你的LINQ问题,因为现在NHibernate不知道性别属性。为了解决这两个问题,我将使用实现i user type的自定义用户类型。

        2
  •  0
  •   Community CDub    7 年前

    我猜您正在将数据库字符串值(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

    希望有帮助。

        3
  •  0
  •   David    14 年前

    令我相当惊讶的是,这幅地图的工作原理是:

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

    因此,映射表示“直接访问字段并将其视为字符串,即使相应的属性是gender类型”。