2011-08-20 71 views
2

我使用流利NHibernate(自动映射)将我的域对象映射到数据库表。我创建了自己的'Date'类,我使用'DateTranslator'映射 - NHibernate的'IUserType'的实现。流利的NHibernate - 应用自定义类型的惯例

public class MyDomainObject : DomainObject 
{ 
    public Date Date { get; set; } 
} 

public class MyDomainObjectMappingOverride : IAutoMappingOverride<MyDomainObject> 
{ 
    public void Override(AutoMapping<MyDomainObject> mapping) 
    { 
     mapping.Map(x => x.Date).CustomType(typeof(DateTranslator)); 
    } 
} 

正如你所看到的 - 我已经创建了一个映射覆盖的领域对象,这样我可以指定要用于映射“日期”属性的自定义类型。

现在 - 这意味着我必须为包含'Date'类型的属性的所有域对象创建映射覆盖。

我想在这里使用一个约定,以便'DateTranslator'将用于映射'Date'类型的所有属性,但我一直无法弄清楚。

任何帮助,这将不胜感激。

回答

2
public class MyUsertypeConvention : IPropertyConvention 
{ 
    public void Apply(IPropertyInstance instance) 
    { 
     if (instance.Type.Name == "Date") 
     //or 
     //if (instance.Type.GetUnderlyingSystemType() == typeof(Date)) 
      instance.CustomType<DateTranslator>(); 
    } 
} 

和配置例如

如果您尝试应用自定义类型的属性,以被认为是默认的参考
FluentMappings.Conventions.Add(new MyUsertypeConvention()) 
+1

将无法​​工作。 –

+1

然后你忘了从automapping中排除自定义类型。覆盖布尔ShouldMap(t){返回t!= typeof(日期)&& base.ShouldMap(t); }' – Firo

+0

我也有这个问题。看起来,ShouldMap(类型类型)永远不会被调用我的属性,它具有自定义基元类型,但它也不会触及我的IPropertyConvention。有什么显而易见的,我可能错过了? – DavGarcia