1

挿入が正常に完了したように見えますが、アイテムが実際にテーブルに挿入されることはありません。

挿入の直後にコンソール ダンプを実行すると、アイテムが挿入されていることが示されますが、テーブルでデータを表示すると、この変更が反映されません。

[ Show Table Data ]を選択すると、変更は反映されませんが、サーバー エクスプローラー内で新しい挿入とクエリを開始すると、適切な変更が反映されます。

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>
4

2 に答える 2

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/によると)

SQL Server Compact Edition データベース ファイルの破損の解決も参照してください。

于 2013-01-29T09:50:26.240 に答える
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

「出力ディレクトリにコピー」というプロパティがあり、デフォルト値は「新しい場合はコピー」です (.mdf または .mdb ファイルを使用している場合、デフォルト値は「常にコピー」です)。この MSDN ドキュメントをチェックして、このプロパティの意味を知ることができます。つまり、ローカル データベース ファイルが出力ディレクトリにコピーされ、そのデータベースが更新されます。

アプリケーションの開発中に (アプリケーション内での実行時に) データに加えられた変更は、bin フォルダー内のデータベースに対して行われます。たとえば、F5 キーを押してアプリケーションをデバッグすると、bin フォルダー内のデータベースに接続されます。ルート プロジェクト フォルダー内のデータベース ファイルは、サーバー エクスプローラー、データベース エクスプローラー、またはその他の Visual Database Tools を使用してデータベース スキーマまたはデータを編集する場合にのみ変更されます。

于 2013-01-29T18:32:51.933 に答える