2012-03-09 6 views
1

FluentNHibernateには、objectのIDを持つドメインオブジェクトがあります。このオブジェクトは常にint(さらに推論すると以下のとおりです)です。今私はSQLiteのバックエンドを持っています。 Idを自動インクリメントとしてマップしたい。これまでのところ、私が持っている:私はNativeを呼び出すときオブジェクト識別子をint型としてマッピングする

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("Users"); 
     Id(x => x.Id).CustomType<int>().GeneratedBy.Native(); 
     Map(x => x.Email); 
    } 
} 

public class User 
{ 
    public virtual object Id { get; set; } 
    public virtual string Email { get; set; } 
} 

をしかし、マップがロードされているとき、それはUser.Id財産(スタックトレースのためのメッセージIdentity type must be integral (int, long, uint, ulong)FluentConfigurationExceptionを投げると言う起こる繰り返しますが、私は実際には自動にしたいです。 -increment整数。

推論オブジェクトのID

私たちがそうしてくださいだけでFO、私はすでに、これは悪い考えであることを十分認識しています。いくつかのRDBMSのと同様にMongoDBのをサポートするために、ビジネス要件を持っていますクスは質問に。 MongoはObjectId(Guidのようなやや連続した値型)をデフォルトのID型として使用します。考え方は、実際のIDタイプを(データレイヤに依存するため)隠すことですが、モデルを再利用し、2つの異なるデータアクセス実装を持ちます(Mongo & NHibernate)。

答えて

3

私はいくつかの理由について

Id(x => x.Id).CustomType<int>() 
    .GeneratedBy.Custom<global::NHibernate.Id.IdentityGenerator>() 
    .UnsavedValue(null); 

をすることによって、この問題を修正終わった、流暢NHibernateのは.CustomType<int>()それは本当に、int型であることを意味することを理解していません。そこでFluentのロジックをバイパスするカスタムジェネレータを追加する必要がありました。

この問題は直ちに解決されますが、コレクション&の外部キーをどのように処理する必要があるかを把握する必要があります。

0

代わりのCustomType<int>、これが機能しない場合、あなただけのIDプロパティを削除し、のみNHibernateはそれをマップすることができCustomType<NHibernate.Type.Int32Type>

を試してみてください。これにはいくつかのプログラミング上の問題があります(本質的には、エンティティのIDを取得するためにNHibernateを呼び出さなければなりません)が動作します。

Fluentがこれをサポートしているかどうかわかりません。私はXMLがそうであると確信しているし、MappingByCodeもそうであることをほとんど確信している。

+0

いいえ、同じエラー – kelloti

+0

「Idプロパティを削除する」とはどういう意味ですか?私はまだIDが必要ですが、パブリックゲッターを持つ必要はありません... – kelloti

+1

私は今 'Id(x => x.Id).CustomType ().GeneratedBy.Custom () 'これは以前のエラーを過ぎています。代わりに 'StaleStateException'を得る:"行が別のトランザクションによって更新または削除された(または保存されていない値のマッピングが間違っていた) "。なぜ、 'Insert'の代わりに' Update'をしようとしていますか? – kelloti

1

ここでは全く別のアイデアがあります。

1つのエンティティを表すのではなく、両方のデータベースシステムが同じ契約を継承する別々のエンティティを持っています。この方法で、契約に対してプログラムを作成してから、データアクセス層で保存するエンティティタイプを決定することができます。

public interface IUser 
{ 
    dynamic Id {get;set;} 
    string Email {get;set;} 
} 

public class MongoUser : IUser{...} 

public class SqlUser : IUser {...} 

とにかく、私は別の見通しを持ってくると思っていました。

関連する問題