使用自定义C#属性选择Fluent约定

时间:2010-07-13 20:54:08

标签: nhibernate fluent-nhibernate fluent custom-attributes

假设您有一组适用于特定映射组的Fluent约定,但不适用于所有映射。

我的想法是,我将创建我可以应用于Fluent * Map类的自定义C#属性 - 并通过检查* Map类来查看是否已应用自定义属性来编写确定接受的约定。

这样,我可以选择约定组,并通过使用自定义属性标记它们来将它们应用于各种映射 - [UseShortNamingConvention]等。

我是NHibernate的新手(和Fluent,以及C#) - 这种方法可行吗?

它是否理智? : - )

谢谢!

1 个答案:

答案 0 :(得分:2)

是的!我实际上做了一些类似的事情,但改为使用Marker Interfaces(INotCacheable,IComponent),但Marker Interface或Attribute,应该没那么大差别。

在应用您的约定时,只需检查您的属性是否存在以及您的好处:)

编辑:

添加一些代码示例

    public class MyMappingConventions : IReferenceConvention, IClassConvention
    {
        public void Apply(IOneToManyCollectionInstance instance)
        {
            instance.Key.Column(instance.EntityType.Name + "ID");
            instance.LazyLoad();
            instance.Inverse();
            instance.Cascade.SaveUpdate();

            if ((typeof(INotCacheable).IsAssignableFrom(instance.Relationship.Class.GetUnderlyingSystemType())))
                return;

            instance.Cache.ReadWrite();
        }

        public void Apply(IClassInstance instance)
        {
            instance.Table(instance.EntityType.Name + "s");
            //If inheriting from IIMutable make it readonly
            if ((typeof(IImmutable).IsAssignableFrom(instance.EntityType)))
                instance.ReadOnly();

            //If not cacheable
            if ((typeof(INotCacheable).IsAssignableFrom(instance.EntityType)))
                return;

            instance.Cache.ReadWrite();
        }
}