FluentNHibernate: как получить доступ к полю, тип данных которого отличается от свойства - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть база данных с полем 'LS_GENDER', в которой полы хранятся как 'M' или 'F'.

Мое приложение использует перечисление Gender для работы с полами.

MyУ сущности есть следующее поле и свойство:

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 голосов
/ 19 ноября 2010

К моему значительному удивлению, это отображение сработало:

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

Таким образом, сопоставление говорит: «напрямую обращаться к полю и рассматривать его как строку, даже если соответствующее свойство имеет тип Gender».

0 голосов
/ 19 ноября 2010

Вы отображаете личное поле, используя показывает :

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

Но это не решает проблему LINQ, потому что теперь NHibernate не знает о свойстве Gender. Для решения обеих проблем я бы использовал пользовательский тип пользователя, который реализует IUserType.

0 голосов
/ 19 ноября 2010

Полагаю, вы отображаете строковое значение базы данных (M, F, U) в перечисление.

Ответ на этот вопрос может помочь вам сопоставить перечисления со строковыми значениями.

Как сопоставить перечисление как значение int с помощью беглого NHibernate? Отображение пользовательских классов перечисления с помощью Fluent Nhibernate

Вы можете использовать настраиваемый тип для сопоставления строк (M, F, U) к полученному вами перечислению.

В вашем классе перечисления используется пользовательский атрибут для указания его строкового значения.Следующая статья может помочь вам сделать это.

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

Надеюсь, что это поможет.

...