У меня есть база данных, полная значений varchar
, а NHibernate - type="string"
отображения type="string"
в nVarchar
. Я знаю, что вместо "string" я могу использовать type="AnsiString"
, но похоже, что было бы гораздо лучше иметь возможность устанавливать это на уровне проекта, а не на уровне столбца.
Есть ли способ сообщить NHibernate использовать string=AnsiString
на глобальной основе? Я не использую Fluent nHibernate.
Используя сопоставление по коду (из ядра 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);
}
}
Если вы намерены использовать систему 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 >()))