【问题标题】:Fluent NHibernate - convention to apply custom typeFluent NHibernate - 应用自定义类型的约定
【发布时间】:2011-08-20 12:26:50
【问题描述】:

我正在使用 Fluent NHibernate(自动映射)将我的域对象映射到数据库表。我创建了自己的 'Date' 类,我使用 'DateTranslator' 进行映射 - NHibernate 的 'IUserType' 的实现。

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));
    }
}

如您所见 - 我为此域对象创建了一个映射覆盖,以便我可以指定应该用于映射“日期”属性的自定义类型。

现在 - 这意味着我必须为所有包含“日期”类型属性的域对象创建一个映射覆盖。

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

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: c# fluent-nhibernate


    【解决方案1】:
    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())
    

    【讨论】:

    • 如果您尝试应用自定义类型的属性默认被视为引用,则该属性将不起作用。
    • 那么您忘记从自动映射中排除自定义类型。 override bool ShouldMap(t) { return t != typeof(Date) &amp;&amp; base.ShouldMap(t); }
    • 我也遇到了这个问题。似乎从来没有为我的具有自定义原始类型的属性调用 ShouldMap(Type type),但它也没有达到我的 IPropertyConvention。有什么我可能错过的明显内容?
    • @DavGarcia 有 2 个 ShouldMap() 方法,一个用于类型,一个用于属性。您应该覆盖类型的一个,并检查 IsComponent() 对于这种类型是否不正确,否则 FNH 会将其自动映射为 Component();如果这对提出更多信息的新问题没有帮助,请告诉我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多