保存null外键

时间:2014-02-23 11:10:54

标签: c# fluent-nhibernate

当我保存我的对象时,除了外键字段外,所有保存好的。 我的模特:

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,Owner为null,Head为“Some head”,Text为“Some text”

为什么所有者为空?我做错了什么?

1 个答案:

答案 0 :(得分: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);