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" />