NHibernate单向一对多关系不保存外键

时间:2015-07-24 08:47:51

标签: c# nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我是NHibernate的新手,我正在创建一个简单的方案来测试框架功能。

我必须使用基本实体:

public class School : BaseEntity
{
    public virtual string Code { get; set; }
    public virtual string Name { get; set; }
}

public class Student : BaseEntity
{
    public virtual string Name { get; set; }
    public virtual string Surname { get; set; }
    public virtual string Email { get; set; }
    public virtual School School { get; set; }
}

从简单的基类继承:

public abstract class BaseEntity
{
    public virtual int Id { get; protected set; }
}

比我用这种方式使用FluentNhibernate映射实体:

return Fluently.Configure()
   .Database(MsSqlConfiguration.MsSql2012.ConnectionString(
        c => c.FromConnectionStringWithKey("DataModel")))
   .Mappings(m => m.AutoMappings
       .Add(AutoMap.AssemblyOf<BaseEntity>()
       .Where(t => t.Namespace == "MyApp.Models"))
       .IgnoreBase<BaseEntity>()
       .Override<User>(map =>
       {
           map.Table("Users");
           map.HasOne<School>(u => u.School).ForeignKey("SchoolId");
       })
       .Override<School>(map =>
       {
           map.Table("Schools");
       })
   ))
   .BuildSessionFactory();

我的测试代码非常简单:

using (var transaction = DbSession.BeginTransaction())
{
    Student u1 = DbSession.Get<Student>("user-id");
    School s1 = DbSession.Get<School>("school-id");

    u1.School = s1; // updating the associated school

    DbSession.SaveOrUpdate(u1);

    transaction.Commit(); // !!! the foreign key is not updated
}

勾选学生表,该行未使用新的学校ID更新。

那么,我的代码有什么问题?我的映射中是否存在不正确(或缺失)的内容?

1 个答案:

答案 0 :(得分:2)

属于Student的{​​{1}}是 School 关系。

5.1.11. many-to-one

  

使用多对一元素声明与另一个持久类的普通关联。关系模型是多对一关联。 (它实际上只是一个对象引用。)

其流畅版本为 many-to-one

References / many-to-one

  

引用用于在两个实体之间创建多对一关系,并应用于“多方”。您正在引用单个其他实体,因此您使用References方法。 #HasMany / one-to-many是References关系的“另一面”,并且应用于“一面”。

     

让我们绘制一本书与其作者之间的关系。

.References()
  

在域名方面,我们有一个作者,可以与任意数量的书籍和书籍相关联,每个书籍和书籍都可以与一个作者相关联。

     

在数据库术语中,我们有一个书表,其外键列引用作者表的主键。

     

要在Book #ClassMap中创建引用关系,请在BookMap构造函数中添加以下调用:

public class Book
{
  public Author Author { get; set; }
}

public class Author
{
  public IList<Book> Books { get; set; }
}

换句话说,如果我们需要使用流利的References(x => x.Author); 关系进行映射,我们就无法使用 many-to-one ,但 .References() < / p>

.HasOne()

要全面了解.References()API,请阅读本文的后半部分(前半部分是按代码进行的bout映射,第二部分是与流利的比较)

Adam Bar的

mapping by code - Many-to-One

注意 - 可以找到//map.HasOne<School>(u => u.School).ForeignKey("SchoolId"); map.References(u => u.School, "SchoolId"); .HasOne() )方案问题here