NHibernate在我进行选择时尝试插入

本文关键字:插入 选择 行选 NHibernate | 更新日期: 2023-09-27 18:22:04

我使用的是NHibernate 3.2

我正在处理一个事务,保存一些东西,在提交之前,我试图查询一些元素,这给我带来了一个oracle插入错误。

我的查询(HQL):

MySession = SessionFactory.OpenSession().BeginTransaction();
/*Do some saves but don't commit*/
var hql = @"select distinct c
from Car c inner join c.Manufacturer manuf where manuf.Id = 449" 
MySession.CreateQuery(hql).List<Car>(); /*throws error*/

当我执行这个查询时,它会向我抛出以下错误

 ORA-01400: cannot insert NULL  ...

我的映射是用创建的

 lazy="true" dynamic-update="true" dynamic-insert="true" 

会话工厂代码:

 private static ISessionFactory _sessionFactory;
        private static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    var configuration = new Configuration();
                    configuration.Configure();
                    configuration.AddAssembly(typeof(EstoqueEquipamento).Assembly);
                    _sessionFactory = configuration.BuildSessionFactory();
                }
                return _sessionFactory;
            }
        }
        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }

谢谢。

NHibernate在我进行选择时尝试插入

NHibernate(FlashMode auto)的默认行为是在执行选择时执行刷新-这不包括ISqlQueries。因此,当您执行hql查询时,就会发生刷新,事实上,刷新发生在hql查询执行之前。

这可能与错误无关,错误只表明它试图保存的实体之一的属性中有一个NULL值,DB会抱怨。

我在这里应该注意,您可能应该将DB约束与映射

相匹配

由于映射不一致,我以前遇到过问题,特别是我有一个不可为null的属性映射到了一个可为null数据库字段。因此,当我检索关联的实体时,一个默认值被分配给了该属性,这让nhibernate认为该实体是脏的,所以它意外地保存了它。它可能是类似的东西吗?