2011-05-31 49 views
0

我對流利NHibernate還是個新手。不知道我應該如何處理這個問題。如何在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"} 

回答

0

當您創建新學生時,您需要設置Department不僅僅是Id。您是否有理由爲此需要單獨的財產?我會從你的實體和你的映射類中刪除這個屬性,並留在Department引用中。如果你需要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); 
+0

嗯,我沒有理會,但我怎麼才能得到selectdepartment?我的意思是它可以只是一個空白對象的部門類? – Joy 2011-05-31 14:55:47

+0

你如何得到你的部門ID?當我看到您使用上面的存儲庫時,您很可能會通過您的存儲庫獲取該部門。 – 2011-05-31 15:06:04

+0

@Cole您好我試圖Mariusz建議現在的問題是它的錯誤提供:這個SqlParameterCollection Count = 5的無效索引5 – Joy 2011-06-02 04:27:42

1

如果你會做這就像在你的職位,因爲您要發送Department對象的空數據,你會得到一個錯誤。正如Cole W所說。您需要將要添加的部門的ID與數據庫中現有部門的ID進行比較。

我將從Cole W answer中定義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 
+0

試圖做到這一點。現在它的錯誤如下所示:該Count = 5的SqlParameterCollection的索引5無效。 – Joy 2011-06-02 03:58:12

+0

你是否改變了行s.Dept_id = dddept.SelectedItem.Value s.Department = rep.SelectedDepartment(1)?如果它不工作,請嘗試移除Map(x => x.Dept_id).Column(「Dept_id」); 從您的映射。我從來沒有這樣的錯誤,但在[這裏](http://devlicio.us/blogs/derik_whittaker/archive/2009/03/19/nhibernate-and-invalid-index-n-for-this-sqlparametercollection-with-count -n-error.aspx)就是解決它的例子。這是第一個Google搜索結果鏈接。 – Mariusz 2011-06-02 08:46:16

+0

感謝您的幫助.. dint實際上得到了第一次的點..新的nhibernate :) – Joy 2011-06-03 05:52:54