2014-09-02 88 views
1

我有一個數據庫完整的varchar值,NHibernate映射type="string"nVarchar。我知道我可以使用type="AnsiString"而不是「字符串」,但是似乎能夠在項目級別而不是在列級別設置此值更有意義。可以將NHibernate字符串類型配置爲默認爲AnsiString?

有沒有什麼辦法可以告訴NHibernate在全球範圍內使用string=AnsiString?我沒有使用Fluent nHibernate。

+0

如果可能的話,嘗試將數據類型從varchar更改爲nvarchar,以獲得更好的兼容性,這將爲您節省大量的麻煩。 – neo 2014-09-02 05:21:46

回答

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

這只是流利的。 – 2014-09-02 05:40:12

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); 
    } 
} 
相關問題