Tag: nhibernate

如何使用Nhibernate在asp.net mvc中实现session-per-request模式

我在global.asax文件的Application_start事件中创建了nhibernate会话,该会话被传递给服务方法的构造函数。 在服务方法我使用会话来做CRUD操作,这很好。但是,当多个请求或并行事务发生时,nhibernate会抛出一些exception。阅读论坛后我才知道Nhibernate会话不是线程安全的。如何使它的线程安全,让我的应用程序(ASP.NET mvc)使用并行trandsactions?

NHibernate QueryOver组没有选择按列分组

有如下查询: var subquery = SessionFactory.GetCurrentSession() .QueryOver() .Where(_ => _.SomeOtherEntity.Id == someId) .SelectList(list => list .SelectGroup(x => x.SomeGroupByProperty) .SelectMax(x => x.MaxPerGroupProperty)) .List(); 生成的sql正在选择SomeGroupByProperty和SomeGroupByProperty最大值。 是否可以让它在SomeGroupByProperty上进行分组,但只选择MaxPerGroupProperty最大值? 这是为了将子查询结果与父查询中的包含一起使用。

如何在n层架构中解决这个NHibernate查询?

试图将NHibernate与我的服务层分离,我碰壁了。 我的架构看起来像这样: web – > services – > repositories – > nhibernate – > db 我希望能够从我的服务层和可能的我的web层产生nhibernate查询,而不知道那些层知道他们正在处理什么样的orm。 目前,我在我的所有存储库中都有一个find方法,它接受IList criteria 。 这允许我传入一个标准列表,例如new object() {“Username”, usernameVariable}; 从我的架构中的任何地方。 NHibernate接受它并创建一个新的Criteria对象并添加传入的标准。 这适用于我的服务层的基本搜索,但我希望能够传入我的存储库转换为NHibernate Criteria的查询对象。 真的,我希望实现类似于这个问题所描述的内容: 抽象nhibernate标准是否有价值 。 我只是没有找到任何关于如何实现这样的东西的好资源。 该问题中描述的方法是一种好方法吗? 如果是这样,有人可以提供一些关于如何实施这样的解决方案的指示吗?

使用Critieria API在NHibernate中选择子查询

所以我有一个具有以下结构的SQL查询: select p.* from ( select max([price]) as Max_Price, [childId] as childNodeId from [Items] group by [childId] ) as q inner join [Items] as p on p.[price] = q.[Max_Price] and p.[childId] = q.[childNodeId] 我需要使用Criteria API在NHibernate中重新创建此查询。 我尝试使用子查询API,但似乎要求内部查询返回单个列以检查与外部查询中的属性的相等性。 但是,我回来了两个。 我已经读过这可以通过HQL API完成,但我需要使用Criteria API来完成,因为我们将动态生成这样的查询。 任何人都可以引导我朝着正确的方向前进吗?

如何正确实现IUserType?

我需要通过编写一个实现IUserType的新mapper类来为NHibernate创建一个自定义类型 。 虽然覆盖大多数方法和属性相对简单,但我理解如何正确处理以下成员会遇到一些困难: object Assemble(object cached, object owner); object DeepCopy(object value); object Disassemble(object value); object Replace(object original, object target, object owner); 我不明白他们的目的是什么; 更重要的是,如何正确实施它们。 我见过的大多数例子都只返回原始输入参数。 public object DeepCopy(object value) { return value; } public object Replace(object original, object target, object owner) { return original; } public object Assemble(object cached, object owner) { return cached; } public […]

NHibernate多对多关系表中的其他字段

当我与nhibernate有很多to.many关系并让nhibernate生成我的db模式时,它会添加一个包含相关实体主键的aditional表。 是否可以向此添加其他字段并访问它们而不必手动使用sql麻烦?

如何做一个流利的nhibernate一对一映射?

我该怎么做我试图进行一对一的映射。 public class Setting { public virtual Guid StudentId { get; set; } public virtual DateFilters TaskFilterOption { get; set; } public virtual string TimeZoneId { get; set; } public virtual string TimeZoneName { get; set; } public virtual DateTime EndOfTerm { get; set; } public virtual Student Student { get; set; } } //类地图 […]

拦截包含NHibernate生成的参数值的SQL语句

我使用一个简单的拦截器拦截nhibernate生成的sql字符串用于登录目的,它工作正常。 public class SessionManagerSQLInterceptor : EmptyInterceptor, IInterceptor { NHibernate.SqlCommand.SqlString IInterceptor.OnPrepareStatement(NHibernate.SqlCommand.SqlString sql) { NHSessionManager.Instance.NHibernateSQL = sql.ToString(); return sql; } } 但是这会捕获没有参数值的sql语句。它们被’?’取代 例如:….在哪里USER0_.USERNAME =? 到目前为止,我发现的唯一替代方法是使用log4nets nhibernate.sql appender,它记录包含参数值的sql语句,但这并不能很好地为我服务。 我需要使用一个拦截器,以便例如。 当我捕获exception时,我想记录导致持久性问题的特定sql语句,包括它包含的值,并将其记录到邮件等等。与进入日志文件寻找导致问题的查询相比,这加速了极大的优势.. 我怎样才能获得完整的sql语句,包括nhibernate在运行时生成的参数值?

如何序列化NHibernate映射对象的所有属性?

我有一些Web方法将我的对象作为序列化XML返回。 它只是序列化对象的NHibernate映射属性……任何人都有一些洞察力? 似乎Web方法实际上是序列化NHibernate代理而不是我的类。 我尝试过使用[XMLInclude]和[XMLElement],但属性仍然没有序列化。 我有一种非常糟糕的hackish方式绕过这个,但我想知道是否有更好的方法! 像这样的东西: public class Graphic { private int m_id; public virtual int Id { get { return m_id; } set { m_id = value; } } private DateTime? m_assigned; public virtual DateTime? Assigned { get { return m_assigned; } set { m_assigned = value; } } private DateTime? m_due; public virtual […]

确保NHibernate SessionFactory仅创建一次

我编写了一个NHibernateSessionFactory类,它包含一个静态的Nhibernate ISessionFactory。 这用于确保我们只有一个会话工厂,并且第一次调用OpenSession()我创建了一个实际的SessionFactory – 下次我使用它并在其上打开一个会话。 代码如下所示: public class NhibernateSessionFactory : INhibernateSessionFactory { private static ISessionFactory _sessionFactory; public ISession OpenSession() { if (_sessionFactory == null) { var cfg = Fluently.Configure(). Database(SQLiteConfiguration.Standard.ShowSql().UsingFile(“Foo.db”)). Mappings(m => m.FluentMappings.AddFromAssemblyOf()); _sessionFactory = cfg.BuildSessionFactory(); BuildSchema(cfg); } return _sessionFactory.OpenSession(); } private static void BuildSchema(FluentConfiguration configuration) { var sessionSource = new SessionSource(configuration); var session = […]