Как вставить дочерний элемент, ссылающийся на внешний ключ в NHibernate? - PullRequest
0 голосов
/ 31 мая 2011

Я все еще новичок в 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"}

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Если вы будете делать это, как в своем сообщении, вы получите ошибку, потому что вы хотите отправить пустые данные объекта Department. Как говорит Коул В. Вам нужно сравнить идентификатор отдела, который вы хотите добавить с идентификатором существующего отдела из базы данных.

Я определю SelectedDepartment от 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
0 голосов
/ 31 мая 2011

Когда вы создаете своего нового ученика, вам нужно установить отдел, а не только 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...