1

データベースに行を追加しましたが、更新するために別のコンテキストで戻ってきました。私はこのクラスを持っています:

public abstract partial class DataManager<I, C> 
    where C : class, IDomainObject, I, new( ) where I : IDomainObject

C は EntityObject かもしれませんが、このクラスはそれを知りません。

私の保存は次のようになります。

    public virtual bool Save( I _item )
    {
        bool rc = true;
        try
        {
        var set = m_Context.GetObjectSet<I, C>( );
        ObjectStateEntry stateEntry = null;
        if( ! m_Context.ObjectStateManager.TryGetObjectStateEntry( ( C ) _item, out stateEntry ) )
        {
            if( _item is EntityObject )
            {
                    if ( _item.IsNew )
                    {
                        set.AddObject( ( C ) _item );
                    }
                    else
                    {
                        try
                        {
                            set.Attach( ( C ) _item );
                        }
                        catch( Exception ex )
                        {
                            set.ApplyCurrentValues( ( C ) _item );
                        }

等々...

私のテスト ケースでは、TryGetObjectStateEntry で stateEntry が見つかりません。ただし、これは EntityObject であり、新しいものではない (IsNew が私のフラグです) ため、else に移動します。ここに私の問題があります:set.Attachはこのエラーをスローします

「同じキーを持つオブジェクトが既に ObjectStateManager に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。」

そして次の瞬間に、ApplyCurrentValues はこれをスローします。

「提供されたオブジェクトのキーと一致するキーを持つオブジェクトが ObjectStateManager で見つかりませんでした。提供されたオブジェクトのキー値が、変更を適用する必要があるオブジェクトのキー値と一致することを確認してください。」

これらの両方がどのように真実である可能性がありますか?

詳しくは:

_item は別のコンテキストで Get によって作成されました。その後、そのコンテキストは破棄されました。その時点で、_item には EntityState.Unchanged がありました。それにいくつかの変更を適用したところ、EntityState.Modified に変更されました。(コンテキスト (およびその ObjectStateManager) がなくなっているはずだったので、私はそれを期待していませんでした。) とにかく、保存 (上記) に到達すると、状態は (デバッガーによって報告されたように) Modified ですが、私は持っていますそれまでに新しいコンテキスト。この時点ですべての ObjectStateEntries (Added、Deleted、Modified、Unchanged) のリストを取得した場合、ApplyCurrentValues が報告するように 2 つしかなく、_item はそれらの 1 つではありませんが、「それはそこにも!」。おそらく問題は、それがまだ古い ObjectStateManager にアタッチされていることです (ObjectStateManager を破棄させない参照があるでしょうか?)。

4

2 に答える 2

0

問題は、db-contextが初期化されるたびに、データベースから行を取得し、各行にエンティティキーを割り当てることです。つまり、2つのdb-contextによって取得された同じ行には、2つの異なるエンティティキーがあります。エンティティキーはエンティティフレームワークのIDのようなものであり、問​​題のエンティティのIDの代わりに使用されます。ただし、テーブルの制約は保持されますが(重複する主キーはありません)、これが理にかなっていることを願っています。

于 2012-06-29T19:37:13.913 に答える
0

問題は、2 人の異なるユーザーを同じ組織に関連付けていることですが、組織オブジェクトはそれぞれの場合で異なるインスタンスです。

組織がすでに DB にある場合は、次を試してください。

  1. 組織へのナビゲーション プロパティを null に設定し、OrganizationId プロパティのみを設定します。

  2. または、DB から組織エンティティをロードし、nav props に配置します。

組織が DB にない場合:

同じインスタンスを使用します (1 つを破棄して、別のインスタンスに置き換えます)。

于 2012-07-02T20:19:39.093 に答える