11

Entity Framework を使用してアプリケーションを開発し、データを .mdf データベースに格納していました。私のコードはデータを読み取ることができます。明らかに保存もできますが、見た目だけです。エラーは発生しません。プログラムが実行されている間、データが保存されたように動作します。たとえば、オブジェクトを保存し、コンテキストを破棄し、新しいオブジェクトを作成し、オブジェクトを検索するとそこにあります! しかし、データベースにクエリを実行して保存されたデータを表示すると、そこには何もありません。アプリを閉じて再度実行すると、すべてのデータが失われます。テスト用に書いたコードの例を次に示します。

        using (DatabaseEntities e = new DatabaseEntities())
        {
            for (int i = 0; i < 50; i++)
            {
                User u = new User();
                u.Nome = "User" + i.ToString();
                e.AddToUser(u);
            }
            int c = e.SaveChanges(true);

            List<User> us = e.User.Where<User>(x => x.ID < 50).ToList<User>();

            foreach (User u in us)
                Console.WriteLine("ID: " + u.ID + " Hello from " + u.Nome);

            Console.ReadKey();
        }

これを実行すると、50 個の出力が得られます。デバッグで c 変数の内容を見ると、50 個の変更があり、すべて問題ないように見えますが、クエリ ブラウザを起動して MDF データベースの内容を調べると、そこには何もありません。

おそらく非常に単純なことだと思いますが、それが何かわかりません。あなたの助けが必要です。

4

4 に答える 4

15

何がうまくいかなかったのかがわかりましたが、実際には何も問題はないと思います。エラーを強制したところ、アクセスしていたデータベースが bin ディレクトリにあることがわかりました。アプリを実行するたびに、Visual Studio がデータベースを bin ディレクトリにコピーしたため、データを手動で追加すると表示されました。ただし、ランタイムでの保存は永続化されません。私はいつもサーバーでデータベースを扱っていましたが、ローカルデータベースを扱うのは初めてだったので、めちゃくちゃにしましたが、助けてくれてありがとう!


編集:ソリューションの提供

ビルド時にデータベースのコピーを無効にする場合は、ソリューション エクスプローラーからファイルCopy to Output Directoyにアクセスする必要があります。または に変更するだけです。 .mdf
Copy if newerDo not copy

DatabaseにアクセスするときCopy if newerは、いくつかのリスクがあることに注意してください。.mdf

于 2009-05-19T21:06:57.520 に答える
4

いくつかのことが思い浮かびます:

  • 接続文字列をダブル/トレブルチェックします。自分だと思っているファイルと本当に話しているのですか?
  • どこでもトランザクションを使用していて、コミットしていませんか?
  • mdf ファイルを「常にコピー」(またはそれが何であれ) に設定していますか?...つまり、ビルド/再生を実行するたびに mdf を常に上書きしていますか?

また、この場合は問題にならないと思いますが、データを検証するには、別のエンティティ/データ コンテキストを使用する必要があります。

using (DatabaseEntities e = new DatabaseEntities()) {
    for (int i = 0; i < 50; i++) {
        User u = new User();
        u.Nome = "User" + i.ToString();
        e.AddToUser(u);
    }
    int c = e.SaveChanges(true);
}
using (DatabaseEntities e = new DatabaseEntities()) {
    List<User> us = e.User.Where<User>(x => x.ID < 50).ToList<User>();
    foreach (User u in us)
        Console.WriteLine("ID: " + u.ID + " Hello from " + u.Nome);
}
Console.ReadKey();

私が言ったように-ここで問題になるとは思えませんが、チェックする価値があります...

于 2009-05-18T06:09:38.880 に答える
0

身分証明書の種類は?GUID? IDはどうやって設定するのですか?デフォルトとして NewID() を使用しますか? その場合、O/R マッパーは ID を読み取ることができず、エンティティに誤って保存されたというフラグが立てられる可能性があります。また、データベースでクエリが実行された場合は、SQL プロファイラーで確認してください。

于 2009-05-18T07:46:46.537 に答える