use*_*312 7 nhibernate one-to-one
这是NHibernate中单向一对一映射的问题.
public class Student
{
public int ID { get; set; }
public int Roll { get; set; }
public int RegNo { get; set; }
public string Name { get; set; }
public StudentDetail StudentDetail { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
public class StudentDetail
{
public int ID { get; set; }
public string Father { get; set; }
public string Mother { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何将这些类(hbm映射文件的外观如何)映射到以下一对一关系的情况?

请仔细查看课程和表格.
我在哪里可以把<many-to-one>标签中Student.hbm.xml还是StudentDetail.hbm.xml?如果我把它插入Student.hbm.xml,我怎么能映射列StudentDetail.StudentID,因为它在不同的表中?
所以这个映射:
<class name="Student" table="Student">
<id name="ID" column="ID">
<generator class="native"/>
</id>
.......
<many-to-one class="StudentDetail" name="StudentDetail" column="StudentID" unique="true" cascade="all" />
</class>
Run Code Online (Sandbox Code Playgroud)
生成以下异常:
{"Invalid column name 'StudentID'."}
Run Code Online (Sandbox Code Playgroud)
另一方面<many-to-one>也不能放入StudentDetail.hbm.xml.Coz,StudentDetail.cs不包含任何类型的属性Student.
我可以使用<one-to-one>-tag吗?如果是的话我应该在哪里放置在Student.cs或StudentDetail.cs?我应该如何配置它?
情况1:
在学生...
<one-to-one name="StudentDetail"
cascade="save-update,delete"
property-ref="Student" />
Run Code Online (Sandbox Code Playgroud)
在StudentDetail ...
<many-to-one name="Student"
column="StudentID"
unique="true"
cascade="none" />
Run Code Online (Sandbox Code Playgroud)
请注意,您必须在StudentDetail类中拥有一个引用Student oobject(称为Student)的属性.此外,根据您的使用情况,您的级联可能会有所不同.不过,你最有可能想要删除级联.
在unique="true"确保在StudentDetail侧的一对一的映射.
案例#2:
只需交换两个映射,确保将属性名称更改为相反的类.
在这里查看更多信息:http: //nhforge.org/blogs/nhibernate/archive/2009/04/19/nhibernate-mapping-lt-one-to-one-gt.aspx
您可以将其映射为一对多,隐藏集合属性,仅公开其第一个元素:
public class Student
{
public virtual int ID { get; set; }
public virtual int Roll { get; set; }
public virtual int RegNo { get; set; }
public virtual string Name { get; set; }
protected virtual IList<StudentDetail> StudentDetails { get; set; }
public virtual StudentDetail StudentDetail
{
get
{
if (StudentDetails.Count == 0) return null;
return StudentDetails[0];
}
set
{
if (StudentDetails.Count != 0) throw new Exception();
StudentDetails.Add(value);
value.Student = this;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以比这更好地处理设置器 - 重点是确保您不会将多行添加到一对多中。显然,在这里,StudentDetails已映射,但StudentDetail不在您的 .hbm.xml 或 Fluent 映射中。
| 归档时间: |
|
| 查看次数: |
2665 次 |
| 最近记录: |