Можно ли настроить тип строки NHibernate по умолчанию на AnsiString?

1

У меня есть база данных, полная значений varchar, а NHibernate - type="string" отображения type="string" в nVarchar. Я знаю, что вместо "string" я могу использовать type="AnsiString", но похоже, что было бы гораздо лучше иметь возможность устанавливать это на уровне проекта, а не на уровне столбца.

Есть ли способ сообщить NHibernate использовать string=AnsiString на глобальной основе? Я не использую Fluent nHibernate.

  • 0
    Если возможно, попробуйте изменить тип данных с varchar на nvarchar для лучшей совместимости, и это избавит вас от многих неприятностей в будущем.
Теги:
nhibernate

2 ответа

0

Используя сопоставление по коду (из ядра NH), вы можете сделать что-то вроде этого:

ModelMapper mapper = new ModelMapper();
// ...
var exportedTypes = assembly.GetTypes();

mapper.BeforeMapProperty += MapperOnBeforeMapProperty;

mapper.AddMappings(exportedTypes);

private void MapperOnBeforeMapProperty(
  IModelInspector modelInspector,
  PropertyPath member,
  IPropertyMapper propertyMapper)
{
  // add special handling for fields if you also
  // map fields
  PropertyInfo info = (PropertyInfo)member.LocalMember;

  if (info.PropertyType == typeof(string)
  {
    propertyMapper.Type(NHibernateUtil.AnsiString, null);
  }
}
0

Если вы намерены использовать систему string = AnsiString в целом, вы должны ее исправить на уровне соглашения NHibernate.

public class StringVarCharConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        if (instance.Property.PropertyType == typeof (string))
            instance.CustomType("AnsiString");
    }
}

Затем вы должны добавить это соглашение в конфигурацию автоматической карты

Fluently.Configure()
.Mappings( m =>
    m.AutoMappings.Add( AutoMap.AssemblyOf<Foo>()
    .Conventions.Add< StringVarCharConvention >()))
  • 2
    Это только свободно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню