数据库列为常量值,而不需要实体类中的属性以及按代码映射

时间:2012-05-07 13:21:56

标签: nhibernate nhibernate-mapping mapping-by-code

除了使用NH的代码映射外,这与this question几乎相同。

我真的需要虚拟属性,因为我还想使用SchemaExport为不同的rdbms创建数据库,而无需为每个rdbms创建/维护脚本。

也许有一位MbC大师知道怎么用MbC

更新:显而易见的简单代码

Property("dummyProperty", c =>
{
    c.Column("legacyColumn");
    c.Access(typeof(MyPropertyAccessor));
});

不起作用

NHibernate.MappingException: Unable to instantiate mapping class (see InnerException): Test.MbC.GroupMap ---> System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> NHibernate.MappingException: Member not found. The member 'dummyProperty' does not exists in type Test.Data.Group
   bei NHibernate.Mapping.ByCode.Impl.CustomizersImpl.PropertyContainerCustomizer`1.GetPropertyOrFieldMatchingNameOrThrow(String memberName)
   bei NHibernate.Mapping.ByCode.Impl.CustomizersImpl.PropertyContainerCustomizer`1.RegisterNoVisiblePropertyMapping(String notVisiblePropertyOrFieldName, Action`1 mapping)
   bei 
   ...

也不是这样,因为上帝知道为什么 MbC在内部用反射检查,该属性确实存在于类

var parameter = Expression.Parameter(typeof(T), "x");
Expression body = Expression.Property(parameter, new GetterPropertyInfo(typeof(T), defaultgetter));
body = Expression.Convert(body, typeof(object));

var lambda = Expression.Lambda<Func<T, object>>(body, parameter);

Property(lambda, m =>
{
    m.Column(defaultgetter.PropertyName);
    m.Access(propertyAccessorType);
});

甚至通过在ClassMapping中覆盖RegisterProperty()来反射禁用测试,它仍会在构建hbm抱怨时抛出:

System.ArgumentOutOfRangeException: Can't add a property of another graph
Parametername: property
   bei NHibernate.Mapping.ByCode.Impl.AbstractBasePropertyContainerMapper.Proper
ty(MemberInfo property, Action`1 mapping)
   bei NHibernate.Mapping.ByCode.ModelMapper.MapProperty(MemberInfo member, Prop
ertyPath propertyPath, IMinimalPlainPropertyContainerMapper propertiesContainer)

   bei NHibernate.Mapping.ByCode.ModelMapper.MapProperties(Type propertiesContai
nerType, IEnumerable`1 propertiesToMap, IPropertyContainerMapper propertiesConta
iner, PropertyPath path)
   bei NHibernate.Mapping.ByCode.ModelMapper.MapProperties(Type propertiesContai
nerType, IEnumerable`1 propertiesToMap, IPropertyContainerMapper propertiesConta
iner)
   bei NHibernate.Mapping.ByCode.ModelMapper.MapRootClass(Type type, HbmMapping
mapping)
   bei NHibernate.Mapping.ByCode.ModelMapper.CompileMappingFor(IEnumerable`1 typ
es)

按代码映射应该比FNH更灵活?在哪里?

2 个答案:

答案 0 :(得分:2)

在投入大量时间尝试在MbC中进行相当简单的映射之后,我承认并再次登上MbC。

即使是这样简单的映射也不是那么灵活的MbC

public class MyClassMap : ClassMap<MyClass>
{
    public MyClassMap()
    {
        Map(x => this.VirtualProp, "legacyColumn").Default("123").Access.None();
    }

    public long VirtualProp { get; set; }
}

这里的优点是我可以使用SchemaExport为遗留应用程序创建兼容的架构,而不会污染我的域类

答案 1 :(得分:0)

你可以用与链接问题相同的方式完成它。 PropertyAccessor的实施保持不变。要在代码映射中使用它,请使用字符串重载映射列(属性的名称是必需的,但在这种情况下并不真正使用)并附加访问者:

Property("dummyPropertyNameForConstant", c =>
{
    c.Column("ConstantColumn");
    c.Access(typeof(CustomAccessor));
});