2014-02-23 126 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);