如何解决如何在NHibernate中插入引用外键的子元素?
| 我还是Fluent NHibernate的新手。不知道我该如何处理。 我有两个实体: public class Student
{
public virtual Guid StudentId { get; set; }
public virtual String Dept_id { get; set; }
public virtual String Name { get; set; }
public virtual int Age { get; set; }
public virtual String Address { get; set; }
public virtual Department Department { get; set; }
}
public class Department
{
public virtual int Dept_id { get; set; }
public virtual String Dept_name { get; set; }
public virtual IList<Student> Students { get; set; }
public Department()
{
Students = new List<Student>();
}
}
和映射是:
public class DepartmentMap : ClassMap<Department>
{
public DepartmentMap()
{
Table(\"Department\");
Id(x => x.Dept_id).Column(\"Dept_id\");
Map(x => x.Dept_name).Column(\"Dept_name\");
HasMany(x => x.Students).KeyColumn(\"Student_id\").Inverse()
.Cascade.All();
}
}
public class StudentMap :ClassMap<Student>
{
public StudentMap()
{
Table(\"Student\");
Id(x => x.StudentId).Column(\"Student_id\").GeneratedBy.GuidComb();
Map(x => x.Name);
Map(x => x.Age);
Map(x => x.Address);
Map(x => x.Dept_id).Column(\"Dept_id\");
References(x => x.Department).Column(\"Dept_id\").Not.Nullable();
}
}
当我尝试插入为:
StudentRepository rep = new StudentRepository();
Student s = new Student();
s.Name = txtname.Text;
s.Age = int.Parse(txtage.Text);
s.Address = txtaddress.Text;
s.Dept_id = dddept.SelectedItem.Value;
rep.Add(s);
它给我的错误是:
{\"not-null property references a null or transient value nHibernateTest.Domain.Student.Department\"}
解决方法
创建新学生时,您不仅需要设置部门,还需要设置ID。您是否有理由为此需要单独的属性?我将从您的实体和您的映射类中删除此属性,仅保留在Department引用中。如果您需要部门ID,则可以通过Student.Department.Dept_id进行引用。
基本上,您尝试在外键列中插入具有空值的实体。您需要将您的创作更改为以下内容:
StudentRepository rep = new StudentRepository();
Student s = new Student();
s.Name = txtname.Text;
s.Age = int.Parse(txtage.Text);
s.Address = txtaddress.Text;
s.Department = SelectedDepartment; //SelectedDepartment is the actual department entity from the database
rep.Add(s);
, 如果您要像在帖子中那样进行操作,则会收到错误消息,因为您要发送Department对象的空数据。正如科尔W所说。您需要将要添加的部门的ID与数据库中现有部门的ID进行比较。
我将从Cole W答案中定义SelectedDepartment。您可以将其添加到存储库。
//repository
public Department SelectedDepartment(int id)
{
Department getDepartment = session.Get<Department>(id);
return getDepartment;
}
//controller
s.Department = rep.SelectedDepartment(1) //for example department with id = 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。