2011-04-13 12 views
0

初めてFluent NHibernateとNHibernateを使うのが初めてです。私は自宅で書かれた約2000年以来、カスタム書面のマッパーを使用しました。約2年前にLinqToSQLに、エンティティに約6ヶ月前に切り替えました。流暢NHibernate?私はこれを正しくしていますか?

私はFluent/NHibernateが提供しなければならないものを見たいと思っています。しかし、私はそれが正しく動作するように見えることはできません。以下は私のクラス、その参照、ClassMapsのコピーです。この簡単な実装が正しいかどうか誰かに教えてもらえますか?

これは私のマッピングとオブジェクトクラス:

それはconfig.BuildSessionFactory(になるたび
using System; 
using System.Linq; 

using NHibernate; 
using FluentNHibernate.Cfg; 
using FluentNHibernate.Cfg.Db; 
using NHibernate.Linq; 

using MyData.Data.Mappings; 

namespace MyData.Data.Repository 
{ 
    public class LoginRepository 
    { 
     private readonly ISessionFactory _sessionFactory; 
     ISession _session; 

     public LoginRepository() 
     { 
      _sessionFactory = this.CreateSessionFactory(); 

      _session = _sessionFactory.OpenSession(); 
     } 

     private ISessionFactory CreateSessionFactory() 
     { 
      string connString = "MyDataConnectionString"; 


     FluentConfiguration config = Fluently.Configure() 
     .Database(MsSqlConfiguration.MsSql2005.ConnectionString(
      x => x.FromConnectionStringWithKey(connString))) 
     .ExposeConfiguration(
      c => c.SetProperty("current_session_context_class", "webContext")) 
     .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Login>()); 

      return config.BuildSessionFactory(); 
     } 

     public IQueryable<Login> GetAllLogins() 
     { 
      return _session.Linq<Login>(); 
     } 
    } 
} 

)それは次のようなエラーがスローされます。これは私のリポジトリである

using System; 

using FluentNHibernate.Mapping; 

namespace MyData.Data.Mappings 
{ 
    public class Login 
    { 
     public virtual int LoginId { get; private set; } 
     public virtual string Username { get; set; } 
     public virtual User User { get; set; } 
    } 

    public class LoginClassMap : ClassMap<Login> 
    { 
     public LoginClassMap() 
     { 
       Table("Logins"); 

       Id(d => d.LoginId).GeneratedBy.Guid(); 
       Map(d => d.Username).Not.Nullable().Length(50); 

       HasOne(d => d.User).ForeignKey("UserId").Cascade.All(); 
     } 
    } 

    public class User 
    { 
     public virtual Guid UserId{ get; private set; } 
     public virtual string FirstName { get; set; } 
     public virtual string LastName { get; set; } 
     public virtual Login Login { get; set; } 
    } 

    public class UserClassMap : ClassMap<User> 
    { 
     public UserClassMap() 
     { 
      Table("Users"); 

      Id(d => d.UserId).GeneratedBy.Guid(); 
      Map(d => d.FirstName).Not.Nullable().Length(100); 
      Map(d => d.LastName).Not.Nullable().Length(100); 

      References(r => r.Login, "UserId").Not.Nullable(); 
     } 
    } 
} 

SessionFactoryの作成中に無効または不完全な設定が使用されました。

内側の例外は次のとおりです。

呼び出しのターゲットが例外をスローされました。

これは正しいアプローチですか?どんなアイデアや調整も大歓迎です!

+0

私はあなたがユーザーのためのClassMapが欠けていると思います。 – Chandu

+0

さて、これはうまく動作しています。しかし、私は実際にそれを使用して呼び出します:var allLogins = login.GetAllLogins()。ToList();次のエラーがスローされます。ファイルまたはアセンブリ 'NHibernate、Version = 2.1.2.4000、Culture = neutral、PublicKeyToken = aa95f207798dfdb4'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。 NHibernate.Linqのようなソースですか? – Sean

+0

Sean、NHibernate.Linqまたは他のNH依存ライブラリは、別のバージョンのNHに対してコンパイルされている可能性があります。この問題をweb.configに追加して解決しました。 \t \t \t \t \t \t \t \t \t \t \t \t AntonioR

答えて

1

Seanでは、GenericBy.Guid()はintであるため、LoginIdでは使用できません。別の発電機を使用するか、LoginIdのタイプを変更してください。

私はあなたがIdであるため、UserIdで「プライベートセット」を使用できないと思われます。

また、HasOne(d => d.User).ForeignKey( "UserId")は、マッピングからデータベースモデルを公開する場合、FK制約の名前が "UserId"になることを意味します。あなたの意図は、テーブル「Users」にPKを保持する名前列を指定することだったようです。

これらのリンクは、より多くに関する情報を持っている:

http://wiki.fluentnhibernate.org/Fluent_mapping

http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/

one-to-one fluent nhibernate?

+0

これは実際に問題だった。私のClassMapと私のクラスが一致しませんでした。最も簡単な事は私の時間のあまりを取った!:) I用途ところで、プライベートセットは大丈夫です。それはGeneratedByとintが混在していたためですもう一度! – Sean

0

プロキシファクトリを指定していないようです。これは次のようにすることができます:

 OracleDataClientConfiguration persistenceConfigurer = OracleDataClientConfiguration 
      .Oracle10 
      .ConnectionString(connectionStringBuilder => connectionStringBuilder.FromAppSetting("Main.ConnectionString")) 
      .ProxyFactoryFactory<ProxyFactoryFactory>() 
      .CurrentSessionContext<ThreadStaticSessionContext>() 
      .AdoNetBatchSize(25) 
      .DoNot.ShowSql(); 

     FluentConfiguration cfg = Fluently.Configure() 
      .Database(persistenceConfigurer) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>()); 

     return cfg.BuildConfiguration(); 
関連する問題