2011-01-02 14 views
1

nhibernateでDBにデータをコミットします。DBから読み込むときにnhibernateセッションの問題が発生する

TimeSlices newTimeSlices = new TimeSlices(timeSliceStartTime, timeSliceEndTime, schedule, newScheduleDay); 
         tsDao.Save(newTimeSlices); 
         tsDao.CommitChanges(); 

しかし、私は、このデータを読み込もう

public ScheduleDays GetByDate(DateTime date, Schedules schedule) 
     { 
      NHibernateSession.Refresh(schedule); 

      DateTime tmpDate = new DateTime(date.Year, date.Month, date.Day, 0, 0, 0); 

      return NHibernateSession.CreateCriteria(typeof (ScheduleDays)) 
       .Add(Restrictions.Eq(ScheduleDaysProperties.Date.ToString(), tmpDate)) 
       .Add(Restrictions.Eq(ScheduleDaysProperties.Schedule.ToString(), schedule)) 
       .UniqueResult<ScheduleDays>(); 
     } 

けどなし成功。私はDBを見て、それはそこにありますが、私はDBからそれを読むことができません。どのように私はセッションをリフレッシュすることができますか、私はそれを保存した後、私はこの新しいデータを読むことができる必要があります。問題は私がajaxコンポーネントを使って作業しているときだけです。

public ScheduleDaysMap() 
     { 
      Id(x => x.ScheduleDayId); 

      Map(x => x.Date) 
       .Not.Nullable(); 

      Map(x => x.MinutesOrderInterval) 
       .Not.Nullable(); 

      References(x => x.Schedule) 
       .Column(TableNames.ScheduleId) 
       .Not.Nullable() 
       .LazyLoad(); 

      HasMany(x => x.Orders) 
       .KeyColumn(TableNames.ScheduleDayId) 
       .Inverse() 
       .LazyLoad() 
       .AsBag(); 

      HasMany(x => x.TimeSlices) 
       .KeyColumn(TableNames.ScheduleDayId) 
       .Inverse() 
       .LazyLoad() 
       .AsBag(); 

      Version(x => x.Timestamp); 
     } 

timeSliceStartTime、timeSliceEndTimeとnewTimeSlicesは型OD日時である

スケジュールDBオブジェクトタイプ(表スケジュール)

newScheduleDayは、DBオブジェクトタイプである(表ScheduleDays)


IでありますC#+流暢なnhibernateを使用しています。

マッピングと遅延ロードまたはasbagに問題がありますか?または何が間違っていることができますか?

答えて

1

私はこの問題を知っているが、ここで私はそれをデバッグする方法をされていない。それは、データベースに正しく保存され

  1. チェック。関係があることを確認してください。
  2. SQL出力を有効にするhere
  3. クエリが生成するSQLを確認します。 SQLを自分で実行してみてください。
  4. 直観を使用してマッピングまたはクエリを変更します。
  5. nHibernate.LINQを使用して、他の方法でクエリを記述してみてください。

nHibernateは、you tell it to以外の場合、クエリをキャッシュしません。

+1

+1優れたデバッグステップ。私は、手順2と3は*常に*非常に有用なので、開発中のすべてのプロジェクトでSQLがデフォルトでログオンしていることがわかりました。 – Ragesh

+0

@Ragesh - うわー、バイナリブロブをデータベースにプッシュする場合は注意してください。実際にはバイナリのペイロードを16進数でエンコードしてログに記録します。 – fostandy

+0

@fostandy、それは良い点です。個人的には、DBからブロブを守るために本当に頑張ってみると、私はその問題に遭遇したことはありません。そして、もちろん、私はロギングを開発中にのみ有効にしています。 – Ragesh

0

あなたはnhibernateプロファイラを実行して、どのクエリが実行されているかを確認できますか。同じものへのリンクはnhprof.com

Googleは非常に簡単なnhprofの使用方法を参照することです。 希望すること

関連する問題