自动化自定义类型

时间:2014-06-02 08:26:24

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

我正在使用流畅的nhibernate设置nhibernate以进行相对简单的设置。除了我的对象上的一个属性外,自动化能够完成目前所有的一切。

我有MongoDB.Bson.ObjectId类型的属性。这是一个简单的不可变结构,它基本上代表了一个二进制ID,它也可以很容易地以字符串格式表示。这些属性导致NHibernate抛出错误说:

  

表PostView中的关联引用了一个未映射的类:   MongoDB.Bson.ObjectId

当然,这是非常期待的,因为我不希望nhibernate理解ObjectId是什么。

我被困的地方是我想要的是能够告诉Nhibernate将这个对象类型映射到数据库中的字符串表示。我希望能够在仍然使用自动化的同时做到这一点,所以我不必明确地映射所有这些对象 - 我想要的是能够只是说"每当你发现此对象类型使用此映射"。我发现提到NHibernate.UserTypes.IUserType似乎看起来像我想要的那样,但我发现没有任何有用的告诉我如何使用它。

总结一下这个问题:

如何自动将自定义数据类型映射到已知类型以存储在数据库中(当然也可以反过来)。

如果可能,我宁愿不将对象更改为存储对象的字符串表示。

1 个答案:

答案 0 :(得分:1)

您必须为此类型编写约定。 像这样:

public class CustomTypeConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType == typeof(MyType));
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(typeof(string));
    }
}

并将此约定添加到映射:

mapping.Conventions.Add(new CustomTypeConvention());