能否将NHibernate字符串类型配置为默认为AnsiString

本文关键字:配置 默认 AnsiString 类型 字符串 NHibernate | 更新日期: 2023-09-27 18:20:21

我有一个满是varchar值的数据库,NHibernate正在将type="string"映射到nVarchar。我知道我可以使用CCD_;字符串";,但是,能够在项目级别而不是在列级别设置它似乎更有意义。

有什么方法可以告诉NHibernate在全球范围内使用string=AnsiString吗?我没有使用Fluent nHibernate。

更新:我之所以问这个问题,是因为使用索引的查询会对性能产生影响。我已经继续了,但我今天刚刚了解到,将数据库设置为使用Windows排序规则,而不是(默认但基本上过时的)SQL排序规则,如果不是我的一致性问题,可能是解决性能问题的一种方法。

能否将NHibernate字符串类型配置为默认为AnsiString

使用代码映射(来自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 >()))