C# NHibernate数据检索问题

C# NHibernate数据检索问题,c#,nhibernate,nhibernate-mapping,mapping,C#,Nhibernate,Nhibernate Mapping,Mapping,这些代码在保存数据时运行良好 但它无法从b_TeacherDetail-表中检索数据。例如: TeacherRepository tRep = new TeacherRepository(); Teacher t = tRep.Get(12); 这里,t.TeacherDetail为null。但是我知道在b_TeacherDetail-表中有一个教师id 12的条目 为什么? 我的桌子是: Teacher {ID, Name, IsActive, DesignationID, Departme

这些代码在保存数据时运行良好

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

TeacherRepository tRep = new TeacherRepository();
Teacher t = tRep.Get(12);
这里,
t.TeacherDetail
null
。但是我知道在
b_TeacherDetail
-表中有一个教师id 12的条目

为什么?

我的桌子是:

Teacher {ID, Name, IsActive, DesignationID, DepartmentID}
TeacherDetail {ID, TeacherID, Address, MobileNo}
教师 TeacherDetail.cs Teacher.hbm.xml

TeacherDetail.hbm.xml

Repository.cs
公共类存储库:IRepository
{
... ... ...
公共T获取(对象id)
{
T obj=默认值(T);
尝试
{
if(!\u session.Transaction.IsActive)
{
_session.BeginTransaction();
obj=(T)_session.Get(id);
_Commit();
_session.Flush();
}
其他的
{
抛出新异常(CustomErrorMessage.TransactionAlreadyInProgress);
}
}
捕获(例外)
{
_session.Transaction.Rollback();
_session.Clear();
投掷;
}
返回obj;
}
... ... ... 
}
TeacherRepository.cs
公共类教师资源库:资源库
{
}

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

你在地图中缺少了从
教师
的角度对
Teacherdetail
的参考。(nhibernate不知道如何获取实体)

因此,在Teacher.hbm.cml中,将更改为:

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


这会告诉它获取一个
TeacherDetail
,它的
Teacher
属性id值等于这个(Teacher)类的id值。

在不重新排列表列的情况下,这真的是可能的吗?对不起,我搞错了,我将编辑我的答案。我刚才看到了你的桌子结构,捷豹是对的。如果未指定
属性ref
,NHibernate将尝试匹配
id
,这在本例中是不正确的。我已删除并重新创建数据库中的表。这确实解决了我的问题。您能告诉我发生了什么吗?您还没有解决问题,重新创建表意味着Id种子(generator=“native”==sql Server Identity?)已重置为1。因此,只要同时向两个表插入,每对教师的表Id就会匹配。当该条件打破时,问题将再次出现
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; }
    }
<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>
<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>
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;
        }
... ... ... 
}
public class TeacherRepository : Repository<Teacher>
    {
    }
<one-to-one class="TeacherDetail" name="TeacherDetail" cascade="all" property-ref="Teacher" />