为什么 ISession 保存不插入

本文关键字:插入 保存 ISession 为什么 | 更新日期: 2023-09-27 17:56:16

似乎

插入已成功完成,但该项目从未实际插入到表中。

如果我在插入

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

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

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 自动递增

表列:

整数 ID |字符串 姓名 |字符串 类别 |停产 |


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>

为什么 ISession 保存不插入

根据您在 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/

另请参阅解决 SQL Server 精简版数据库文件中的损坏问题

根据@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

有一个属性"复制到输出目录",默认值为"如果较新则复制"(如果您使用的是.mdf或.mdb文件,则默认值为"始终复制")。您可以查看此 MSDN 文档以了解此属性的含义。简而言之,本地数据库文件将被复制到输出目录,并且该数据库是将要更新的数据库

在应用程序

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