NHibernate数据检索问题

时间:2010-07-09 09:57:40

标签: c# nhibernate nhibernate-mapping mapping

这些代码在保存数据时效果很好。

但它无法从b_TeacherDetail - 表中检索数据。例如:

TeacherRepository tRep = new TeacherRepository();
Teacher t = tRep.Get(12);

此处t.TeacherDetailnull。但是我知道b_TeacherDetail - 表中有一个条目用于教师ID 12。

为什么?

我的表是:

Teacher {ID, Name, IsActive, DesignationID, DepartmentID}
TeacherDetail {ID, TeacherID, Address, MobileNo}

Teacher.cs

public class Teacher
    {
        public virtual int ID { get; set; }
        public virtual string Name { get; set; }
        public virtual bool IsActive { get; set; }        
        public virtual TeacherDetail TeacherDetail { get; set; }

        public virtual Designation Designation { get; set; }
        public virtual Department Department { get; set; }        
    }

TeacherDetail.cs

public class TeacherDetail
    {
        public virtual int ID { get; set; }
        public virtual Teacher Teacher { get; set; }
        public virtual string Address { get; set; }
        public virtual string MobileNo { get; set; }
    }

Teacher.hbm.xml

<class name="Teacher" table="b_Teacher">
    <id name="ID" column="ID">
      <generator class="native"/>
    </id>

    <property name="Name" column="Name" />
    <property name="IsActive" column="IsActive" />

    <one-to-one class="TeacherDetail" name="TeacherDetail" cascade="all" />

    <many-to-one name="Department" class="Department" unique="true" column="DepartmentID" />
    <many-to-one name="Designation" class="Designation" unique="true" column="DesignationID" />
  </class>

TeacherDetail.hbm.xml

<class name="TeacherDetail" table="b_TeacherDetail">
    <id name="ID" column="ID">
      <generator class="native"/>
    </id>

    <property name="Address" column="Address" />
    <property name="MobileNo" column="MobileNo" />

    <many-to-one name="Teacher" class="Teacher" column="TeacherID" unique="true" />
  </class>

Repository.cs

public class Repository<T> : IRepository<T>
    {
        ... ... ...

        public T Get(object id)
        {
            T obj = default(T);

            try
            {
                if (!_session.Transaction.IsActive)
                {
                    _session.BeginTransaction();
                    obj = (T)_session.Get<T>(id);
                    _session.Transaction.Commit();
                    _session.Flush();
                }
                else
                {
                    throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                }
            }
            catch (Exception)
            {
                _session.Transaction.Rollback();
                _session.Clear();

                throw;
            }

            return obj;
        }
... ... ... 
}

TeacherRepository .cs

public class TeacherRepository : Repository<Teacher>
    {
    }

2 个答案:

答案 0 :(得分:2)

您在映射中TeacherDetail的观点缺少对Teacher的引用。 (nhibernate不知道如何获取实体)

所以在Teacher.hbm.cml中更改为:

<one-to-one class="TeacherDetail" name="TeacherDetail" cascade="all" property-ref="Teacher" />

告诉它获取TeacherDetail,其Teacher属性id值等于此(Teacher)类的id值。

答案 1 :(得分:0)

我认为你应该让Teacherdetail多对一而不是一对一