0

私は流暢な nhibernate を使用しており、派生クラスが何であるかに依存する特定のテーブルに、それ自体では存在できない抽象基本クラスのプロパティをマップしようとしています。

public class UnmappedClass : Entity<Guid>
{
    // This class isn't mapped to a table on its own, its mapping depends on the class that uses it
}

public abstract class BaseClass : Entity<Guid>
{
    // mapping depends on derived class, not mapped to anything in base class
    protected IList<UnmappedClass> myList = new List<UnmappedClass>();

    public virtual IEnumerable<UnmappedClass> Stuff
    {
        get { return myList.ToList(); }
    }
}

public class DerivedClass : BaseClass
{
    // At this point, I need to map MyClass in member myList to a table specific to DerivedClass
}

オーバーライドで次のことを試しましたが、エラーが発生しましたInvalid object name 'UnmappedClass'.

mapping.HasMany(Reveal.Member<DerivedClass, IEnumerable<UnmappedClass>>("myList"))
    .Table("TableName")
    .Access.Field()
    .Cascade.AllDeleteOrphan()
    .Inverse();
4

1 に答える 1

0

これがあなたが望むものかどうかは完全にはわかりませんが、ジェネリックを使用するのはどうですか? 次に例を示します。

public abstract class BaseClass<T> : Entity<Guid>
    where T : UnmappedClass
{
    // mapping depends on derived class, not mapped to anything in base class
    protected IList<T> myList = new List<T>();

    public virtual IEnumerable<T> Stuff
    {
        get { return myList.ToList(); }
    }
}

public class DerivedClass : BaseClass<MyClass>
{
}

マッピング クラスも汎用基本クラスです。

public abstract class BaseClassMap<TEntity, TList> : ClassMap<TEntity>
    where TEntity : BaseClass
    where TList : UnmappedClass
{
    protected BaseClassMap()
    {
        HasMany(Reveal.Member<TEntity, IEnumerable<TList>>("myList"))
            .Table("TableName")
            .Access.Field()
            .Cascade.AllDeleteOrphan()
            .Inverse();
    }
}

public class DerivedClassMap : BaseClassMap<DerivedClass, MyClass>
{
}

コードがコンパイルされるかどうかは確認しませんでした。MyClass のテーブル (「TableName」という名前) によって参照される DerivedClass のテーブルを取得する必要があります。

于 2013-01-23T17:13:25.497 に答える