2012-03-13 7 views
5

私は文字列を主キーとして使うbrownfieldデータベースを扱っています。 Fluent NHibernateSqlite(ユニットテスト用インメモリプロバイダ)およびSQL Server 2005を使用してください。(流暢)NHibernateの文字列キーの使い方

I以下のエンティティがあります。このマッピングで

public class Entity 
{ 
    public virtual DateTime TimeStamp { get; set; } 

    public virtual string Name { get; set; } 
} 

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Map(_ => _.TimeStamp); 
     Id(_ => _.Name).CustomType("AnsiString"); 
    } 
} 

は、しかし、それは動作しません。この作業を行う方法NHibernate.TypeMismatchException : Provided id of the wrong type. Expected: System.Int32, got System.String

を言いましたか?また、流暢なnhibernateが利用可能であることについての良い文書はありますか?

ありがとうございます。

+0

Thxを、彼らは私にとって新しいものでもなく、私の質問に関連したものが含まれているどちらもかかわらず:)私は、文字列キーについては何も見つけることができませんでしたそこ。また、明示的なマッピングから始めたいと思います。 –

+0

これはこのリンクで議論されていますhttp://stackoverflow.com/questions/411825/nhibernate-with-string-primary-key-and-relationships –

+0

@krystanhonour正確ではありません。また、その質問には受け入れられた答えがありません。あなたが答えを知ることができれば、あなたはここでそれを再投稿して、投票と謝辞を得ることができますか?どうも。 –

答えて

12

あなたの主キーとして文字列を使用している場合は、おそらくこのような何かする必要があります:

5.1.4.7:NHibernateのドキュメントから

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Id(x => x.Name).GeneratedBy.Assigned(); 
     Map(x => x.TimeStamp); 
    } 
} 

を。割り当てられた識別子

アプリケーションに識別子を割り当てさせる場合(NHibernateが生成する とは対照的に)、割り当てられたジェネレータを使用することができます。 この特別なジェネレータは、オブジェクトの識別子プロパティに既に割り当てられた識別子値 を使用します。この 機能を使用してビジネス上の意味(ほとんどの場合、恐らく デザイン決定)のキーを割り当てるときには十分注意してください。

このジェネレータを使用するエンティティは、本質的な性質のため、 には、そのセッションのSaveOrUpdate()メソッドで保存することはできません。代わりに のSave()メソッドまたはUpdate()メソッドを呼び出すことによってオブジェクトを保存する場合は を明示的にNHibernateに指定するか、 を更新する必要があります。

また関連記事です。これは、日付ビットですが、まだ自分の状況に適用されます。リンクについては

http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/6c9620b7c5bb7ca8