如何在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
    

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...