0

Entity Framework 4.1 で MVC4 を使用しています。

最初に、データベースから Ado.net エンティティ モデルを作成しました。.edmx ファイルでは、特定のテーブルの主キーを持っていないため、データベース内の一部のテーブルが表示されません。

プロジェクトが進むにつれて、主キー フィールドを持たないログ テーブルの 1 つに更新する必要があります。

そのため、データベースを変更する代わりに、.edmx ファイルを変更しました。クライアントから、データベース フィールドを変更しないように依頼されました。.edmx を変更し、テーブル内の既存のフィールドの 1 つ (たとえば、tbl_logテーブル) に pk を作成しました。

tbl_log を更新しようとしています。しかし、次のようなエラーメッセージが表示されますStore update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

スタック オーバーフローに関する多くの質問を見て、少しグーグルで調べましたが、解決策が見つかりませんでした。

私も ObjectStateManager エントリを更新しようとしましたが、それでも同じエラーを指しています。

これが私のコードです

    tbl_log log = new tbl_log();

                    Entity.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified);

    log.LoginId = strLoginId;
    log.Password = strPassword;
    log.IPAddress = strIpAddress;
    log.Date_Time = DateTime.Parse(DateTime.Now.ToString());
    log.sessionId = new Guid(strSessionId);

    Entity.AddTotbl_log(log);

Entity.SaveChanges();// optimistic concurrency error

助けてください

ありがとう、

カーシック

4

1 に答える 1

0

モデルはデータベーススキーマを表す必要があります。モデルにPKを追加する場合は、データベースにも存在する必要があります。そうしないと、エラーが発生します。テーブルが監査ログテーブルであっても、どのテーブルにもPKを設定しないことは一般的に悪い習慣です。

例外は、オブジェクトトラッカーが、データベースへの最後の呼び出し以降にオブジェクトの状態が変更されたかどうかを判断できないことです。これは、フレームワークが挿入/更新クエリを送信した後でも、設定したPKが0のままであるためです。

残念ながら、これを回避する良い方法はありません。(Microsoftがそう思うように)データベース内のすべてのテーブルに主キー列を追加することをお勧めします。

編集-コメントから

PKはオブジェクトの追跡に使用されるため、モデルにStoreGenerationPattern of Identityを含めるようにPKを設定した場合、値が変更されることが期待されます。それが変わらないとき、それはあなたが見ているエラーを投げます。StoreGenerationPatternをNoneに変更してみてください。そうすると、EFはfaux-PKが変更されることを期待しなくなります。

于 2012-10-25T09:46:13.347 に答える