1

解決策を見つけることができず、助けが必要なシナリオがあります。これを達成するにはどうすればよいですか。クライアントの現在のレコードを取得して、更新する代わりに、新しいレコードをテーブルに追加したいです。履歴変更情報

    client c = new client();
    using (DBEntities db = new DBEntities())
    {
        // get current records in the client table for client
        IQueryable<client> co = from p in db.client where p.CUS_NUMBER == scd.cus_number && p.isCurrent == true select p;

        c = co.First();

        //update email and and address
        c.EMAIL = Helper.CleanInput("mymail@mm.com");
        c.ADDRESS = Helper.CleanInput("123 Sheppard");

        //instead of updating current record I'd like to add new record to the table to keep historical changes
        db.AddToclient(c);
        db.SaveChanges();
        //I get error that 
        //An object with the same key already exists in the ObjectStateManager. 
        //The existing object is in the Modified state. An object can only be added to 
        //the ObjectStateManager again if it is in the added state.

完全なエラー

同じキーを持つオブジェクトが ObjectStateManager に既に存在します。既存のオブジェクトは Modified 状態です。オブジェクトは、追加された状態にある場合にのみ、ObjectStateManager に再度追加できます。

4

4 に答える 4

1

このコード db.AddToclient(c);を削除してください。残りはすべて問題ありません。すでに参照によってオブジェクトにアクセスしているため、再度追加する必要はありません。呼び出すと変更されますsavechanges()

または、新しいオブジェクトを追加する場合は複製を使用しますc = co.First().Clone();

于 2013-02-26T10:33:15.977 に答える
0

エラーが発生する理由db.AddToclient(c);は、このオブジェクトが、データベース内にある可能性があるため、オブジェクトコンテキストによって追跡されているためです。

あなたがやろうとしていることを達成するための最良の方法は、次のようなものです。

var newClient = new client()
{
    EMAIL = Helper.CleanInput("mymail@mm.com"),
    ADDRESS = Helper.CleanInput("123 Sheppard"),
};

db.AddToclient(newClient);
db.SaveChanges();
于 2013-02-26T10:35:53.063 に答える
0

データベースに同じ行を追加しているようですが、DBが許可しない同じ主キーを持つ同じ行を再度追加したためにエラーが発生しています。

新しい行を追加し、古い行の履歴情報と外部キーとしての参照を保持する別のテーブルを作成してみてください。削除に関する情報を保持するブールフィールドを追加して、IsDeletedにすることができます。

それが感謝に役立つことを願っています

于 2013-02-26T10:45:10.197 に答える
0

Entity Framework では、既定でデータベースから取得されたすべてのオブジェクトは、ObjectContext インスタンスによって追跡されます。Entity Framework は、キーによって追跡されているすべてのオブジェクトを内部的にマップします。このパターンIdentity Mapと呼ばれます。これは、キーごとにエンティティのインスタンスが 1 つだけ存在することを意味します。エンティティは既に EF マップ上にあるため、Add を再度呼び出す必要はありません。変更されたエンティティを永続化するには、SaveChanges を呼び出すだけです。

あなたの場合、あなたは:

1 - EF ObjectContext の新しいインスタンスを作成します。
2 - LINQ クエリでエンティティを取得します。
3 - 取得したエンティティのプロパティの値を変更します。
4 - ObjContext に再度追加します。//エラー!
5 - SaveChanges() の呼び出し

ObjectContext は取得したオブジェクトを既に認識しているため、手順 4 は必要ありません。

于 2013-02-26T10:58:05.843 に答える