我有一個數據庫完整的varchar
值,NHibernate映射type="string"
到nVarchar
。我知道我可以使用type="AnsiString"
而不是「字符串」,但是似乎能夠在項目級別而不是在列級別設置此值更有意義。可以將NHibernate字符串類型配置爲默認爲AnsiString?
有沒有什麼辦法可以告訴NHibernate在全球範圍內使用string=AnsiString
?我沒有使用Fluent nHibernate。
我有一個數據庫完整的varchar
值,NHibernate映射type="string"
到nVarchar
。我知道我可以使用type="AnsiString"
而不是「字符串」,但是似乎能夠在項目級別而不是在列級別設置此值更有意義。可以將NHibernate字符串類型配置爲默認爲AnsiString?
有沒有什麼辦法可以告訴NHibernate在全球範圍內使用string=AnsiString
?我沒有使用Fluent nHibernate。
如果打算在系統範圍內使用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>()))
這只是流利的。 – 2014-09-02 05:40:12
通過代碼中使用映射(從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);
}
}
如果可能的話,嘗試將數據類型從varchar更改爲nvarchar,以獲得更好的兼容性,這將爲您節省大量的麻煩。 – neo 2014-09-02 05:21:46