我在地图中有这样的东西
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中,或者是否通过并检查用户表中的更改,然后检查“另一个表”是否有变化?
或者是否对用户表和另一个表的所有字段进行闪烁更新。
这是否意味着我的意思是保存整个对象?
答案 0 :(得分:2)
您告诉NHibernate使用.Not.Nullable()
验证此属性的空值。
当然,如果它是空的,会发出适当的消息而抱怨。
如果你想让它可以为空......只是不要告诉它: - )
更新:我仍然无法理解您的担忧。如果您检索用户实例(实际上,如果您有Id,则甚至不必转到数据库;只需使用session.Load
)并且不更改任何属性,为什么NHibernate会“重新保存”它? / p>
答案 1 :(得分:1)
不,它不会重新保存/更新用户对象。它只会得到它的ID并更新Fk列。如果你不想知道幕后发生了什么,你可以尝试使用SQL Server Profiler(如果你的数据库是MSSQL)或NHibernate Profiler。
顺便说一句,检查这个ayende's post,它讲述了在NHibernate中保存/更新/删除级联的不同方法。