0

EF と Oracle Data Provider for .Net を使用する OData サービス ( WCF Data Services 5.6 ) があります。サービスから db サーバーへのクエリをトレースすると、1 つの列だけを変更しても、UPDATE にはテーブルのすべての列が含まれていることがわかります。たとえば、5 つの列を持つテーブルを作成し、クライアントで 1 つを変更して、SaveChanges() を呼び出すことができます。サーバー側では、オラクルで私は得る

UPDATE col1=x, col2=x,col3=x,col4=x WHERE ....

この問題についてインターネットで多くのことを読みましたが、まだ明確な解決策が見つかりませんでした.確かに、この問題を抱えているのは私だけではありませんが、誰かがこれを修正する方法を考えているかもしれません.

EF6 が間もなく登場し、WCF Data Services チームが EF6 のアルファをリリースするようですが、最初はまだアルファであり、EF6 は RC であり、2 つ目はいくつかの問題があり、3 つ目は同じ問題が存在しないという保証はありません。新しいバージョン。

誰かが正しい答えを持っていることを願っています...

4

2 に答える 2

1

わかりました、これを行う方法が少なくとも1つ好きなようです。WCF サービスでは、 ChangeInterceptor で:

  [ChangeInterceptor("Entity")]
        public void OnChange(Entity item, UpdateOperations operations)
        {
            Dictionary<string, object> changes = new Dictionary<string, object>();
            foreach (String propName in this.CurrentDataSource.Entry(item).CurrentValues.PropertyNames)
            {
                if (this.CurrentDataSource.Entry(item).Property(propName).IsModified)
                    changes.Add(propName, this.CurrentDataSource.Entry(item).Property(propName).CurrentValue);
            }
            this.CurrentDataSource.Entry(item).State = System.Data.EntityState.Unchanged;
            var arrayOfAllChangedProps = changes.Keys.ToArray();
            foreach(string prop in arrayOfAllChangedProps)
                this.CurrentDataSource.Entry(item).Property(prop).CurrentValue = changes[prop];
            return;
        }

変更された値を取得し、それらをディクショナリに追加し (他のコレクションにすることもできます)、変更された状態のフラグをリセットします。これより前にフラグがリセットされると、変更を取得できません。フラグがリセットされると、変更のためにフラグをリセットする前に、現在の値を保存された値に設定します。

このすべての後、変更された列のみが UPDATE ステートメントにあることがわかります。

本当に理解できません。なぜこれがデフォルトの動作ではないのですか? そして、なぜこのすべての魔法が行われなければならないのか。さらに、これが正しい方法であるかどうかはわかりません。しかし、少なくともこれは私にとってはうまくいきます。

于 2013-10-13T19:00:53.007 に答える
0

EF5 と DS5.6 を使用して、テスト データセットで次の SQL クエリを生成しました。

exec sp_executesql N'update [dbo].[People]
set [City] = @0
where ([Id] = @1)
',N'@0 nvarchar(max) ,@1 bigint',@0=N'Mashville',@1=1

OData クエリ:http://localhost:50000/People(1L)

OData ペイロード:{ "City": "Mashville" }

PATCHの代わりに HTTP メソッドを使用するのを忘れたのかもしれませんPUT

于 2013-10-15T16:35:51.697 に答える