除了使用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更灵活?在哪里?
答案 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));
});