3

エンティティ フレームワーク 4.1 (POCO) を使用して、1 回のボタン クリックで 100 レコードを更新する必要があります。データベースのラウンドトリップを行わずに、変更されたレコードをデータベースに保存する必要があります (パフォーマンスの問題を回避するため)。

デタッチとアタッチでいくつかの解決策を見てきました。

アタッチ時にエラーが発生 する エンティティ オブジェクトは、IEntityChangeTracker の複数のインスタンスによって参照できません

そのため、最初にデタッチを試みましたが、新しいエラーが発生します The object cannot be detached because it is not attached to ObjectStateManager

私はリポジトリ パターンを使用してエンティティのリストを取得し、グリッドでバインドするために UI レイヤーに渡します。

ボタンのクリックで、これらのエンティティを DB レイヤーに渡して更新します。

エンティティを選択してcontext.applychangesを実行すると、正常に機能します。パフォーマンスの問題のため、この往復を避ける必要があります。

    public void Update(OPRPortCall portCall)
    {
        using (VMEntities context = new VMEntities())
        {
            context.Detach(portCall); //The object cannot be detached because it is not attached to the ObjectStateManager.
            context.AttachTo("OPRPortCalls", portCall); //An entity object cannot be referenced by multiple instances of IEntityChangeTracker
            context.ObjectStateManager.ChangeObjectState(portCall, EntityState.Modified);

            context.SaveChanges();
        }
    }

これに対する解決策を教えてください。

クリストファー

4

2 に答える 2

1

技術的には、オブジェクトが既にアタッチされているかどうかを最初にテストすることで、これを解決できます。

public void Update(OPRPortCall portCall)
{
    using (VMEntities context = new VMEntities())
    {
        ObjectStateEntry ose;
        this.ObjectStateManager.TryGetObjectStateEntry(portCall, out ose);
        if (ose == null)
        {
            context.OPRPortCalls.Attach(portCall);
        }
        context.ObjectStateManager.ChangeObjectState(portCall, EntityState.Modified);

        context.SaveChanges();
    }
}
于 2013-02-21T13:29:42.250 に答える
0

コンテキストから取得したエンティティのみをデタッチできます。この例では、コンテキストを作成します (この時点ではエンティティはありません)。その後、デタッチを試みます。

2 番目の問題については、エンティティがアタッチされている別のコンテキストがあると思います。このため、エンティティを 2 番目のコンテキストにアタッチすることはできません。

この問題 (アタッチ/デタッチ) については、複数のコンテキストを作成して 1 つのコンテキストのみを使用することを避けてください (おそらく、関数のパラメーターとして渡すか、プライベート クラス変数として設定できます)。

100 個のエンティティを更新するという特定の問題については、次のことができます。 1. すべてのエンティティの同じ列を更新できる場合は、ストアド プロシージャを作成します (値を渡し、UPDATE ステートメントを実行します)。 2. すべてのエンティティを更新し、SubmitChages() を呼び出します。このコマンド EF は UPDATE TABLE を 100 回実行します。 3. 「UPDATE TABLE SET ...」などのデータベースに対してカスタム クエリ コマンドを実行します。

これが助けになることを願っています。

于 2013-02-21T11:31:40.293 に答える