Использование IUsertype с полем ID в NHibernate 3.3+ Mapping-By-Code

Я работаю с NHibernate 3.3 и использую систему сопоставления по коду. Таблица/база данных, с которыми я работаю, будет доступна только для чтения для моего приложения.

Проблема, с которой я столкнулся, заключается в том, что мой столбец первичного ключа хранится как двоичное поле в SQL Server. Мне нужно прочитать это как строку, и, к сожалению, я не могу изменить таблицу (включая добавление индексированных представлений).

На данный момент я пытаюсь использовать IUsertype для преобразования значения из двоичного в строковое. Однако я застрял, пытаясь установить тип столбца Id в объекте для использования IUserType.

Мне удалось успешно сделать это для обычных свойств, как в приведенном ниже примере, но я не могу понять, как это сделать для столбцов идентификаторов и столбцов внешнего ключа.

public class ExampleEntity
{
    public virtual String MyIdColumn { get; set; }
    public virtual Country Country { get; set; }
}


public class ExampleEntityMap : ClassMapping<ExampleEntity>
{

    public ExampleEntityMap()
    {
        Table("Table");

        Id(i => i.Id, map =>
        {
            map.Column("MyIdColumn");
            map.Type(???);
        });
        Property(i => i.Country, map =>
                                  {
                                      map.Column("Country");
                                      map.Type<CountryEnumUserType>();
                                  });
    }
}
  1. Возможно ли это с картированием по коду NH3.3?
  2. Должен ли я вместо этого реализовать IIdentifierType, чтобы добиться того, что IUserType делает для поля Id?
  3. Может ли преобразователь NHibernate добиться того, что я делаю?
  4. Есть ли другой способ решить эту проблему? Помимо извлечения данных и их преобразования в C#, так как мне приходится делать это для многих столбцов в более чем дюжине таблиц.

Спасибо


person Prabu    schedule 26.09.2013    source источник


Ответы (2)


Догадаться. В итоге я использовал свойство CompposedId для сопоставления столбца Id, что позволяет указать IUserType для столбца Id.

public class ExampleEntityMap : ClassMapping<ExampleEntity>
{
    public ExampleEntityMap()
    {
        Table("Table");

        ComposedId(i => i.Property(p => p.MyIdColumn, map =>
                                                    {
                                                        map.Column("MyIdColumn");
                                                        map.Type<MyIdColumnUserType>();
                                                    }));

        Property(i => i.Country, map =>
                              {
                                  map.Column("Country");
                                  map.Type<CountryEnumUserType>();
                              });
    }
}
person Prabu    schedule 28.09.2013

Упомянутое вами решение работает, хотя и немного взломано.

Чтобы это работало, сущность также должна переопределить Equality/GetHashCode, что-то вроде:

    public override bool Equals(object obj)
    {
        return Country == (obj as ExampleEntity)?.Country;
    }

    public override int GetHashCode()
    {
        return this.Country.GetHashCode();
    }

А при загрузке с помощью Get нужно делать с помощью:

session.Get(new ExampleEntity{ Country = Countries.Kenya });

Я постараюсь найти лучшее решение и опубликую его здесь.

person Răzvan Flavius Panda    schedule 06.12.2016