我是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更新。
那么,我的代码有什么问题?我的映射中是否存在不正确(或缺失)的内容?
答案 0 :(得分:2)
属于Student
的{{1}}是 School
关系。
使用多对一元素声明与另一个持久类的普通关联。关系模型是多对一关联。 (它实际上只是一个对象引用。)
其流畅版本为 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的注意 - 可以找到//map.HasOne<School>(u => u.School).ForeignKey("SchoolId");
map.References(u => u.School, "SchoolId");
( .HasOne()
)方案问题here