能否将NHibernate字符串类型配置为默认为AnsiString
本文关键字:配置 默认 AnsiString 类型 字符串 NHibernate | 更新日期: 2023-09-27 18:20:21
我有一个满是varchar
值的数据库,NHibernate正在将type="string"
映射到nVarchar
。我知道我可以使用CCD_;字符串";,但是,能够在项目级别而不是在列级别设置它似乎更有意义。
有什么方法可以告诉NHibernate在全球范围内使用string=AnsiString
吗?我没有使用Fluent nHibernate。
更新:我之所以问这个问题,是因为使用索引的查询会对性能产生影响。我已经继续了,但我今天刚刚了解到,将数据库设置为使用Windows排序规则,而不是(默认但基本上过时的)SQL排序规则,如果不是我的一致性问题,可能是解决性能问题的一种方法。
使用代码映射(来自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 >()))