假设您有一组适用于特定映射组的Fluent约定,但不适用于所有映射。
我的想法是,我将创建我可以应用于Fluent * Map类的自定义C#属性 - 并通过检查* Map类来查看是否已应用自定义属性来编写确定接受的约定。
这样,我可以选择约定组,并通过使用自定义属性标记它们来将它们应用于各种映射 - [UseShortNamingConvention]等。
我是NHibernate的新手(和Fluent,以及C#) - 这种方法可行吗?
它是否理智? : - )
谢谢!
答案 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();
}
}