2011-03-25 10 views
0

流暢なnhibernateで奇妙なエラーが発生しました。私はインターフェイスから継承するクラスの基本セットを持っており、インターフェイスをテーブルにマップしています。クラスがこれらを利用する場合は、インターフェイスのジェネリックを実装します。それらは以下のように定義される。Fluent nHibernate - 一部のインターフェイスを保存します。

interface IPage { 
    // properties 
} 

class IPageMap : ClassMap<IPage> { 
// mapping information 
} 

class Page : IPage { 
// IPage Implementation 
} 

class ITag { 
    // properties 
} 

class ITagMap : ClassMap<ITag> { 
    // mapping information 
} 

class Tag : ITag { 
    // ITag implementation 
} 

class Template { 
    virtual IList<IPage> Pages { get; set; } 
    virtual IList<ITag> Tags { get; set; } 
} 

これは正常に動作するはずです。このようなオブジェクトを作成すると...

var pages = new List<IPage> { 
    new Page { 
    // .. 
    } 
} 

pages.ForEach(x => { session.SaveOrUpdate(x); }); // no exception here 

var tags = new List<ITag> { 
    new Tag { 
    // ... 
    } 
} 

tags.ForEach(x => { session.SaveOrUpdate(x); }); // exception happens here. 

var list = new List<Template> { 
    new Template { 
    Pages = new List<IPage> { 
     new Page { 
      // ... 
     } 
    }, 
    Tags = new List<ITag> { 
     new Tag { 
      // .. 
     } 
    } 
    } 
} 

私は次のような例外があります。

Tag

のための存続はありませんさて、私はTagのために存続を定義していませんでしたが、私はITagのためにした、とTagはそれを継承します。 IPagePageは同じように動作します。タグ情報をコメントアウトしてIPagePageの実装をそのまま残しておけば、それはうまく動作します。

なぜITagTagが異なって扱われるのですか?何か案は?

答えて

2

TagITagのサブクラスとしてマップする必要があります。すべての永続型を別々にマップする必要がある場合は、サブクラスのメンバーがどこに行くのかをNHに伝える必要があります(NHがデータベースがない場合でもNHに具体的なタイプをインスタンス化する必要があります)。

+0

大丈夫ですが、なぜ私は 'Page'でそれをしなければいけませんでしたか?私はサブクラスとしてマップしていないし、それでも動作します。 – Ciel

+1

ここに私があなたに教えてくれる違いはありません。違いがあるはずです。 –

+0

はい、私の完全な混乱。 e.e – Ciel

関連する問題