Fluent nhibernate 如何在NHibernate中插入引用外键的子元素?

Fluent nhibernate 如何在NHibernate中插入引用外键的子元素?,fluent-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 S

我还是个新手。我不知道该怎么做

我有两个实体:

 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>();
    }
}
它给我的错误是:

{"not-null property references a null or transient value nHibernateTest.Domain.Student.Department"}

当您创建新学生时,您需要设置部门而不仅仅是Id。您需要单独属性的原因是什么?我将从您的实体和映射类中删除此属性,并将其保留在Department引用中。如果您需要部门Id,您可以通过Student.Department.Dept\u 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);

如果您将这样做,就像在您的帖子中一样,您将得到一个错误,因为您希望发送部门对象的空数据。正如科尔W所说。您需要将要添加的部门id与数据库中现有部门的id进行比较

我将从Cole W答案中定义所选部门。您可以将其添加到存储库中

//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
//存储库
公共部门选定部门(内部id)
{
Department getDepartment=session.Get(id);
返回部门;
}
//控制器
s、 Department=rep.SelectedDepartment(1)//例如id=1的部门

我了解tht,但我怎样才能找到所选部门?我的意思是它可以仅仅是Department类的一个空白对象吗?你是如何得到你的部门ID列表的?我看到您正在使用上述存储库时,您很可能会通过存储库了解部门。@Cole嗨,我按照Mariusz的建议尝试过了,现在问题是它的给出错误为:此带有Count的SqlParameterCollection的索引5无效=5@Joy,是否删除了映射(x=>x.Dept_id)。列(“Dept_id”)@科尔,好的!!我的坏朋友,我无法删除映射。。但我怎么能引用它呢?就像我想把它绑在gridview上一样?那么我真的需要得到部门id你能给我举个例子吗?如果你真的可以?试着这么做。现在给我的错误是:计数为5的SqlParameterCollection的索引5无效。是否将行s.Dept_id=dddept.SelectedItem.Value更改为s.Department=rep.SelectedDepartment(1)?如果它不工作,请尝试删除Map(x=>x.Dept\u id).Column(“Dept\u id”);从你的地图。我以前从未犯过这个错误,但这是解决它的一个例子。这是谷歌的第一个链接。谢谢你的帮助。。迪恩第一次就明白了。。nhibernate中的新名称:)
    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);
//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