为啥 ISession 保存不插入?

Posted

技术标签:

【中文标题】为啥 ISession 保存不插入?【英文标题】:Why is ISession save not inserting?为什么 ISession 保存不插入? 【发布时间】:2013-01-28 15:52:18 【问题描述】:

似乎插入成功完成,但该项目从未真正插入到表中。

如果我在插入后立即进行控制台转储,它会将项目显示为已插入,但当我在表格上显示数据时,它不会反映此更改。

如果我选择“显示表数据”,则不会反映更改,但我在服务器资源管理器中启动新的插入和查询,则它会反映正确的更改。

在 GITHUB 上的项目:https://github.com/Fabii23/NHibernate.git

SQL 输出:

INSERT INTO Products (Name, Category, Discontinued) VALUES (@p0, @p1
, @p2);@p0 = 'Barley and Oats' [Type: String (0)], @p1 = 'Grains' [Type: String
(0)], @p2 = 0 [Type: Int32 (0)]
NHibernate: select @@IDENTITY

try
             
    //Try an insert
    using (ISession session = NHibernateTest.NHibernateHelper.GetCurrentSession())
            
                using (ITransaction transaction = session.BeginTransaction())
                
                    int _bool = 1;
                    var product = new Product("Wonder Bread", "Bread", _bool);
                    session.Save(product);
                    transaction.Commit();
                
            

        
        catch (Exception e)
        
            Console.WriteLine("Error occurred :" + e.Message);
            Console.WriteLine("Error occurred :" + e);
        


请注意,ID autoincrements

表格列:

int 标识 | 字符串 名称 | 字符串 类别 | 已停产|


Sql 输出:

NHibernate: INSERT INTO Products (Name, Category, Discontinued) VALUES (@p0, @p1
, @p2);@p0 = 'Wonder Bread' [Type: String (0)], @p1 = 'Bread' [Type: String (0)]
, @p2 = 1 [Type: Int32 (0)]
NHibernate: select @@IDENTITY

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="HibernateExample" namespace="HibernateExample.Domain" >
  <class name="Product" table="Products">
    <id name="Id" type="integer">
      <generator class="identity"/>
    </id>
    <property name="Name" type="string"/>
    <property name="Category" type="string"/>
    <property name="Discontinued" />
  </class>
</hibernate-mapping>

休眠规格:

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
    <session-factory>
      <property name="connection.driver_class"> NHibernate.Driver.SqlServerCeDriver</property>
        <property name="dialect">NHibernate.Dialect.MsSqlCeDialect</property>
      <property name="connection.connection_string">Data Source=FirstSample.sdf;</property>
      <property name="show_sql">true</property>
    </session-factory>
  </hibernate-configuration>

【问题讨论】:

会话是否关闭/刷新? NHibernate 将批量访问数据,直到刷新会话 - 我假设你的 using 应该处理/刷新 sesh - 你使用什么 ISession 实现? @Charleh 是的,ISession的实现是NHibernate.ISession 嗯,代码在我看来没问题——那肯定不是回滚? @Charleh 不,我不这么认为,如果我在插入后立即进行控制台转储,它会将项目显示为已插入,但是当我在表上显示数据时,它不会反映这种变化。 冒着听起来像明显船长的风险,您确定连接到正确的数据库吗?这是作为单元测试的一部分运行的吗? Setup/Teardown 是否正在刷新数据库?这在我身上发生了好几次:) 【参考方案1】:

根据您在 github 上发布的代码,您应该知道将要更新的数据库是位于 bin\debug 目录(用于调试模式)中的数据库,而不是位于项目源目录根目录的数据库。

还要注意,每次重新编译应用程序时,该数据库都会被覆盖(并重新初始化)。


如果你改变这一行,它会改变什么吗:

<property name="connection.connection_string">Data Source=FirstSample.sdf;</property>

<property name="connection.connection_string">Data Source=FirstSample.sdf;FLUSH INTERVAL=1</property>

(根据http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/cac9593a-4ee2-4f62-897f-96204af45a27/)

另见resolving corruption in SQL Server Compact Edition database files

【讨论】:

我添加了上面的更改,但我仍然遇到同样的问题。 @Fabii 感谢您的回答。然后我会尝试什么 - 检查是否不是嵌套事务 - 显式刷新会话 - 尝试 SaveOrUpdate 而不是 Save 我将其移出,因此事务没有嵌套并显式调用 Flush 并尝试了 SaveOrUpdate,但仍然没有运气。 该项目在 github 上可用:github.com/Fabii23/NHibernate.git 如果您想更深入地了解一下。 @Fabii 在 vs2012 中打开它,进行了一些转换,并成功运行了 hibernateexample 控制台应用程序,并在 sdf 中插入了一些行。请注意,相关的 sdf 位于 bin/debug 中(并且它将在每次构建时重新初始化)【参考方案2】:

基于@Jbl 的评论。只是等待@Jbl 发表他的评论作为答案,以便我接受。

这是对正在发生的事情的准确解释。

来源:http://msdn.microsoft.com/en-us/library/ms233817.aspx

来源:http://blogs.msdn.com/b/vsdata/archive/2009/07/31/debugging-with-local-database-file.aspx

有一个属性“Copy to Output Directory”,默认值为“Copy if newer”(如果您使用的是 .mdf 或 .mdb 文件,默认值为“Copy always”)。您可以查看此 MSDN 文档以了解此属性的含义。简而言之,本地数据库文件将被复制到输出目录,该数据库将被更新

在应用程序开发过程中,对数据所做的任何更改(在应用程序的运行期间)都会对 bin 文件夹中的数据库进行。例如,当您按 F5 调试应用程序时,您将连接到 bin 文件夹中的数据库。仅当您使用服务器资源管理器、数据库资源管理器或其他可视化数据库工具编辑数据库架构或数据时,才会更改根项目文件夹中的数据库文件。

【讨论】:

以上是关于为啥 ISession 保存不插入?的主要内容,如果未能解决你的问题,请参考以下文章

尝试在空对象上调用接口方法“android.media.session.ISessionController android.media.session.ISession.getController(

当 CacheMode=Ignore 时,为啥 NHibernate.ISession.CreateQuery 会返回与 CreateSQLQuery 不同的东西?

NHibernate Isession管理

在 Asp.Net MVC 应用程序中使用 Structuremap 将 ISession 注入我的存储库

休眠一个 isession 相同的 idbconnection

如何将 [] 索引应用于“ISession”类型的表达式?