从DB读取时出现nhibernate会话问题

时间:2011-01-02 20:45:07

标签: c# nhibernate fluent-nhibernate

我使用nhibernate在DB中提交了一些数据。

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>();
        }

但没有成功。我查看数据库,它在那里,但我无法从数据库中读取它。如何刷新会话或我必须做什么,我可以在保存后读取这些新数据。问题仅在我使用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 DateTime

schedule是DB对象类型(Table Schedules)

newScheduleDay是数据库对象类型(Table ScheduleDays)


我正在使用C#+流利的nhibernate 1.1

映射和延迟加载或asbag可能有问题吗?或者可能出现什么问题?

2 个答案:

答案 0 :(得分:1)

我不知道问题,但这是我将如何调试它:

  1. 检查数据库中是否已正确保存。检查关系是否存在。
  2. 根据here
  3. 打开SQL输出
  4. 检查查询生成的SQL。尝试自己运行SQL。
  5. 使用直觉更改映射或查询。
  6. 尝试以其他方式编写查询,例如使用nHibernate.LINQ。
  7. 除非you tell it to,否则nHibernate不会缓存查询。

答案 1 :(得分:0)

嘿,你可以运行nhibernate探查器,看看有什么查询被触发。链接到nhprof.com

谷歌看看如何使用nhprof非常简单。 希望有所帮助