1

いくつかのマッピングをセットアップしようとしていますが、この例外が発生しています:

マップされていないクラスを拡張できません: CommonEntity

[MappingException: マップされていないクラスを拡張できません: CommonEntity]
NHibernate.Cfg.XmlHbmBinding.ClassBinder.GetSuperclass(String extendsName) +217
NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddEntitiesMappings(HbmMapping mappingSchema, IDictionary`2 inheritedMetas) +352
NHibernate.Cfg.XmlHbmBinding .MappingRootBinder.Bind(HbmMapping mappingSchema) +85
NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName) +156

私は3つのクラスを持っています。Entity、CommonEntity、および User。エンティティまたは共通エンティティ テーブルはなく、ユーザー テーブルのみです。ユーザーは CommonEntity から継承し、CommonEntity は Entity から継承します。Entity と CommonEntity は抽象的です。

このマッピングを定義しました:

public class Mapping : ConventionModelMapper
{
    public Mapping()
    {
        IsRootEntity((type, declared) =>
        {
            return typeof(Entity<Guid>) == type.BaseType;
        });

        IsEntity((x,y) => typeof(Entity<Guid>).IsAssignableFrom(x) && !x.IsAbstract && !x.IsInterface);

        Class<Entity<Guid>>(x =>
                                {
                                    x.Id(c => c.Id, m=>m.Generator(Generators.GuidComb));
                                    x.Version(c=>c.Version, (vm) => { });
                                });
    }
}

これは次のように使用されます:

        var types = typeof(Mapping).Assembly.GetExportedTypes().Where(t => typeof(Entity<Guid>).IsAssignableFrom(t));
        var mapping = new Mapping().CompileMappingFor(types);
        configuration.AddMapping(mapping);

User と CommonEntity の両方が「types」配列にあります。CommonEntity のマッピングも追加しようとしましたが、違いはありませんでした。

        Class<CommonEntity>(x =>
        {
            x.Property(c => c.DateCreated, m => m.Type<UtcDateTimeType>());
            x.Property(c => c.DateModified, m => m.Type<UtcDateTimeType>());
        });

また、クラスの代わりにサブクラスを呼び出してみました。User を Entity から直接継承すると、すべて正常に動作します。何か助けはありますか?

4

1 に答える 1

0

問題は、CommonEntity が IsRootEntity の要件を満たしていたことにあるようです。私はそれをそのように修正しましたが、今はうまくいっているようです。

   IsRootEntity((type, declared) =>
                         {
                             return !type.IsAbstract &&
                                    new[] {typeof (Entity<Guid>), typeof (CommonEntity)}.Contains(type.BaseType);
                         });
于 2012-11-10T13:31:54.113 に答える