1

これは、 NHのコードによるマッピングを使用することを除いて、この質問とほぼ同じです。

また、SchemaExportを使用して、それぞれのスクリプトを作成/保守する必要なしに、さまざまな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よりも柔軟である必要がありますか?どこ?

4

2 に答える 2

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を使用して、ドメインクラスを汚染することなく、レガシーアプリと互換性のあるスキーマを作成できることです。

于 2012-05-29T13:17:40.407 に答える
0

リンクされた質問とほとんど同じ方法でそれを行うことができます。の実装はPropertyAccessor同じままです。コードによるマッピング内で使用するには、文字列オーバーロードを使用して列をマップし(プロパティの名前は必須ですが、この場合は実際には使用されません)、アクセサーをアタッチします。

Property("dummyPropertyNameForConstant", c =>
{
    c.Column("ConstantColumn");
    c.Access(typeof(CustomAccessor));
});
于 2012-05-09T17:24:05.230 に答える