我应该使用流利的Nhibernate参考不可空吗?

时间:2011-02-14 00:16:42

标签: nhibernate fluent-nhibernate

我在地图中有这样的东西

public class Settings : ClassMap<Setting>
{
  References(x => x.User).Not.Nullable();
}

现在,每次我想保存设置时,我都必须给它一个用户对象,否则我得到

  

not-null属性引用null或   瞬态值

我的想法是,通过这样做,我将强制执行关系约束。然而,当我真的需要使用Fk时,我必须传递整个对象,这似乎很奇怪。

我希望它不会在内部重新保存整个内容,只是添加Fk来保持关系约束。

我是以正确的方式做到这一点吗?

修改

 public class Settings : ClassMap<Setting>
 {
      Id(x => x.SettingId);
      Map(x => x.Something);
      Map(x => x.Something2);
      References(x => x.User).Not.Nullable();
 }


Public class User: ClassMap<User>
{
   Id(x => x.UserId);
   Map(x => x.FirstName);
   Map(x => x.LastName);
   HasOne(x => x.Settings);
   HasMany(x => x.AnotherTable);
}


Settings s = new Settings()
{
      Something = "142",
      Something2 = "1421414"
};

session.Create(s); // this will crash as s.User equals null;

我必须这样做

User user = repo.GetUser("userId");

Settings s = new Settings()
{
      Something = "142",
      Something2 = "1421414",
      User = user
};

session.Create(s); // this should work.

现在我想知道因为我做了User = user; nhibernate是否只是抓取userId并将其保存到Settings tbl中,或者是否通过并检查用户表中的更改,然后检查“另一个表”是否有变化?

或者是否对用户表和另一个表的所有字段进行闪烁更新。

这是否意味着我的意思是保存整个对象?

2 个答案:

答案 0 :(得分:2)

您告诉NHibernate使用.Not.Nullable()验证此属性的空值。

当然,如果它是空的,会发出适当的消息而抱怨。

如果你想让它可以为空......只是不要告诉它: - )

更新:我仍然无法理解您的担忧。如果您检索用户实例(实际上,如果您有Id,则甚至不必转到数据库;只需使用session.Load)并且不更改任何属性,为什么NHibernate会“重新保存”它? / p>

答案 1 :(得分:1)

不,它不会重新保存/更新用户对象。它只会得到它的ID并更新Fk列。如果你不想知道幕后发生了什么,你可以尝试使用SQL Server Profiler(如果你的数据库是MSSQL)或NHibernate Profiler

顺便说一句,检查这个ayende's post,它讲述了在NHibernate中保存/更新/删除级联的不同方法。