正如您在以下代码中看到的,我在Save
方法中关闭会话。我猜这就是为什么AddUserSettings
无效的原因。使这项工作的最佳做法是什么?在Save
方法关闭会话是不是很糟糕?在UserSettings
保存时,DB中没有用户,那么是否会产生问题?如何处理会话外的问题?
用户
public class User : BaseClass<User>
{
public virtual int UserId { get; set; }
public virtual string UserName { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string Email { get; set; }
}
public virtual void AddUserSettings(UserSettings us)
{
us.User = this;
UserSettings = us;
}
用户设置
public class UserSettings : BaseClass<UserSettings>
{
public virtual int UserSettingsId { get; set; }
public virtual User User { get; set; }
public virtual string FacebookId { get; set; }
public virtual string FacebookToken { get; set; }
}
保存方法
using (var session = NHibernateHelper.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
session.SaveOrUpdate(x);
transaction.Commit();
}
}
代码
user = new Entity.User();
us = new Entity.UserSettings();
us.FacebookId = "foo";
us.FacebookToken = "foo";
user.AddUserSettings(us);
us.Save();
user.UserName = "foo";
user.FirstName = "foo";
user.LastName = "foo";
user.Email= "foo";
user.Save();
答案 0 :(得分:1)
每个业务操作都应该使用一个会话,因此在每个保存方法中对它进行微观管理并不是一个好主意:
有关如何在使用ActiveRecord模式时处理会话,请参阅Caslte.ActiveRecord example。本质上,会话是根据上下文共享的,以实现有意义的事务边界和性能提升。
或者您切换到使用实体之外的会话,以便您拥有更多NHibernate的选项和功能。
答案 1 :(得分:0)
我发现了问题;
首先我需要创建主对象然后保存然后我可以添加子类而没有问题。
user = new Entity.User();
user.UserName = "foo";
user.FirstName = "foo";
user.LastName = "foo";
user.Email= "foo";
user.Save();
us = new Entity.UserSettings();
us.FacebookId = "foo";
us.FacebookToken = "foo";
user.AddUserSettings(us);
us.Save();