2014-02-23 129 views
0

當我保存我的對象時,除了外鍵的字段外,全部保存好。 我的模型:保存null外鍵

public class Persons{ 
     public virtual string Name { get; set; } 
     public virtual string Password { get; set; } 
     public virtual int Id { get; set; } 
    } 

public class Notes{ 
     public virtual int Id { get; set; } 
     public virtual Persons Owner { get; set; } 
     public virtual string Head { get; set; } 
     public virtual string Text { get; set; } 
    } 

我的映射:

public class PersonsMap : ClassMap<Persons>{ 
    public PersonsMap(){ 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.Password); 
     Table("Persons"); 
    } 
} 

public class NotesMap: ClassMap<Notes>{ 
    public NotesMap(){ 
     Id(x => x.Id); 
     Map(x => x.Head); 
     Map(x => x.Text); 
     HasOne(x => x.Owner); 
     Table("Notes"); 
    }   
} 

我的代碼:

public void CreateNote(int id, Notes note){ 
     using (var session = NHibernateHelper.OpenSession()){ 
      using (var transaction = session.BeginTransaction()){ 
       note.Owner = session.QueryOver<Persons>().Where(x => x.Id ==  
       id).SingleOrDefault(); // note.Owner = {Id = 1; Name = "Name";   
             // Password = "Password"} 
       session.Save(note); 
       transaction.Commit(); 
      } 
     } 
    } 

操作的結果是更迭,但:

ID爲2,業主爲空,頭是「Some head」,文字是「Some text」

爲什麼所有者爲空?我做錯了什麼?

回答

0

我認爲你的映射是不正確的。筆記和人之間的關係不是一對一的。他們不共享主鍵。

http://www.jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/

public class NotesMap: ClassMap<Notes>{ 
    public NotesMap(){ 
     Id(x => x.Id); 
     Map(x => x.Head); 
     Map(x => x.Text); 

     References(x => x.Owner) 
      .Cascade.SaveUpdate(); 

     Table("Notes"); 
    }   
} 

此外,當您只需要設置有關係了,你並不需要真正查詢數據庫,這樣做的時候,你知道ID。使用session.Load保存查詢。

note.Owner = session.Load<Persons>(id);