似乎插件已成功完成,但该项实际上从未插入到表中。
如果我在插入后立即执行控制台转储,它会将项目显示为已插入,但是当我在表格上显示数据时,它不会反映此更改。
如果我选择“显示表格数据”,则不会反映更改,但我会在服务器资源管理器中启动新的插入和查询,然后它会反映正确的更改。
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 自动增量
表格列:
int 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>
答案 0 :(得分:2)
根据您在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
答案 1 :(得分:1)
基于@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文档以了解此属性的含义。简而言之,本地数据库文件将被复制到输出目录,THAT数据库将被更新。
在应用程序开发期间,对数据所做的任何更改(在应用程序中的运行时)都会对bin文件夹中的数据库进行更改。例如,当您按F5调试应用程序时,您将连接到bin文件夹中的数据库。只有在使用服务器资源管理器,数据库资源管理器或其他Visual Database Tools编辑数据库模式或数据时,才会更改根项目文件夹中的数据库文件。