nHibernate(a==b)等式
我目前使用的是nHibernate,但有一个问题,即两个对象分别加载,但在数据库中表示同一个实体,它们的引用不相等 例如,请参见以下代码部分:nHibernate(a==b)等式,nhibernate,Nhibernate,我目前使用的是nHibernate,但有一个问题,即两个对象分别加载,但在数据库中表示同一个实体,它们的引用不相等 例如,请参见以下代码部分: CrudRepository<Customer> cr1 = new CrudRepository<Customer>(); Customer c1 = cr1.GetById(new Guid("0D19B0F0-CA41-4D4B-9FB9-9CF600F86A4B")); CrudRepository<Custome
CrudRepository<Customer> cr1 = new CrudRepository<Customer>();
Customer c1 = cr1.GetById(new Guid("0D19B0F0-CA41-4D4B-9FB9-9CF600F86A4B"));
CrudRepository<Customer> cr2 = new CrudRepository<Customer>();
Customer c2 = cr2.GetById(new Guid("0D19B0F0-CA41-4D4B-9FB9-9CF600F86A4B"));
if (c1.Equals(c2))
MessageBox.Show("SAME!"); // True.
if (c1.GetHashCode().Equals(c2.GetHashCode()))
MessageBox.Show("SAME!"); // True.
if (c1 == c2)
MessageBox.Show("SAME!"); // False.
您正在为每个请求创建一个新会话(这是您的
NHibernateHelper.OpenSession()
方法所做的),并且nHibernate只保证一个会话内的引用相等。一旦您确保您的请求在同一个会话中,两个调用的结果将是同一个对象。在整个应用程序中保持相同的会话是什么意思。您是只创建一个会话实例,还是为每个工作单元、操作、请求或其他任何内容创建一个新的会话实例?谢谢Thomas。我没注意到!你对会话管理有什么建议吗?这样也许我已经加载的收藏可以保持活动状态?我这样问是因为我看到其他用户提到会话不应该保持打开状态,而应该在每次操作后关闭。你怎么认为?再次感谢。在修改nHibernateHelper类以持久化会话之后,我发现CRUD操作周围的“Using”语句正在关闭会话。在解决了您提到的问题后,使用“我的对象”的问题现在是相等的:)Thanks@TonyDay迟来的评论,但仍然。。。诀窍在于正确定义“操作”。操作不是存储库上的单一方法-当人们说“每次操作后关闭”时,操作通常是一个完整的用户请求。因此,该模式可以被称为每请求会话。这也使您能够正确地在同一事务中运行完整的请求。@Oskarbergren您的评论非常有用。当时,由于我使用的是桌面应用程序,所以我对每请求会话的方法没有太多的了解。由于我一直在web应用程序领域工作(使用Spring),幸运的是,我现在对这种方法有了更好的理解。感谢您的留言:-)
public T GetById(Guid guid)
{
using (ISession session = NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
return session.Get<T>(guid);
}
}
public class NHibernateHelper
{
private static ISessionFactory sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (sessionFactory == null)
{
var configuration = new Configuration();
configuration.Configure();
configuration.AddAssembly(typeof(Customer).Assembly);
sessionFactory = configuration.BuildSessionFactory();
}
return sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}