Отображение URI в строку в Fluent NHibernate - PullRequest
4 голосов
/ 19 декабря 2009

(см. Этот связанный вопрос для LINQ-to-SQL)

Я бы хотел отобразить класс, который имеет член URI, в столбец string, используя NHibernate. Как именно я могу это сделать?

Я не думаю, что решение данного вопроса здесь работает - я не могу объявить приватное поле и отобразить его, потому что отображение должно ссылаться на это поле.

Ответы [ 2 ]

8 голосов
/ 24 июня 2012

Если вам не нужно делать что-то особенное, UriType, предоставляемое NHibernate, будет работать (я не знаю, какая версия была представлена ​​- я использую 3.1.4000). Нет необходимости писать пользовательский тип пользователя.

ClassMap

Вы можете указать UriType в ClassMap<>:

public class ImportedWebImageMap : ClassMap<ImportedWebImage>
{
    public ImportedWebImageMap()
    {
        Id(x => x.Id);
        Map(x => x.SourceUri).CustomType<UriType>();
    }
}

Конвенция о собственности

Вы можете использовать соглашение о свойствах для сопоставления всех Uri свойств для использования UriType:

public class UriConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        if (typeof(Uri).IsAssignableFrom(instance.Property.PropertyType))
            instance.CustomType<UriType>();
    }
}

Хранить как varchar

Если вы хотите сохранить Uri в базе данных как varchar вместо значения по умолчанию nvarchar, вы можете создать пользовательский тип, производный от UriType и указывающий тип AnsiString SQL:

public class UriAnsiStringType : UriType
{
    public UriAnsiStringType()
        : base(new AnsiStringSqlType())
    { }

    public override string Name
    {
        get { return "UriAnsiStringType"; }
    }
} 
3 голосов
/ 19 декабря 2009

То же решение будет работать нормально; Вы можете определить строковое свойство как приватное, чтобы оно никому не показывалось.

Fluent NHibernate не справляется с этим так же легко, как стандартные файлы HBM, но это можно сделать несколькими способами. См. Свободные NHibernate Wiki для получения инструкций.

В качестве альтернативы, я думаю, вам нужно определить класс IUserType, который может загружать / сохранять значение в виде строки. Пример выполнения этого с помощью Fluent NHibernate можно найти в конце этого сообщения в блоге .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...