2

このトピックに関する多くの質問のどれも、私の状況に一致していないようです。私は大きなデータモデルを持っています。場合によっては、少数のフィールドのみを UI に表示する必要があるため、すべてを取得する LINQ to Entity クエリを、必要な列のみを取得する Entity SQL クエリに置き換え、Type コンストラクターを使用して、次のように、DbDataRecord ではなくエンティティが返されます。

SELECT VALUE MyModelNameSpace.INCIDENT(incident.FieldA, incident.FieldB, ...) FROM ... AS ...

これは機能し、UI にフィールドが表示されます。変更を加えた場合、UI 要素からタブで移動すると、エンティティ モデルに戻ります。しかし、SaveChanges を実行すると、変更がデータベースに保存されません。ログにエラーは表示されません。ここで、上記のクエリをエンティティ全体を取得する Entity Sql クエリに慎重に置き換えると、次のようになります。

SELECT VALUE incident FROM MyDB.INCIDENTs AS incident...

変更はデータベースに永続化されます! そのため、テストとして、エンティティ内のすべての列に名前を付けた最初のクエリと同様の別のクエリを作成しました。これは、2 番目の Entity SQL クエリとまったく同じである必要があります。それでも、データベースへの変更も保持されませんでした。

次のように、返された結果の MergeOption を PreserveChanges に設定して、追跡を開始しようとしました。

incidents.MergeOption = MergeOption.PreserveChanges;

しかし、それは効果がありません。しかし実際には、Entity Sql を使用してエンティティ全体を取得しても変更が保持される場合、フィールドのサブセットが取得されるときに異なる動作をする論理的な目的は何でしょうか? これはバグなのだろうか?

4

1 に答える 1

0

Gert は正しかった。問題は、エンティティがアタッチされていないことだった。ダンク・ユー・ウェル、ゲルト!Ik は ervan verbluft でした。 完全なソリューションを示すために、少し詳細を追加したかっただけです。基本的に、ObjectContext には Attach メソッドがあるので、それだと思います。ただし、Entity SQL の select ステートメントで列に名前を付け、Type を使用してオブジェクトを作成すると、EntityKey は作成されず、ObjectContext.Attach は失敗します。自分で作成した EntityKey を挿入しようとして失敗した後、Entity Framework 4 で追加された ObjectSet.Attach に出くわしました。失敗する代わりに、欠落している場合は EntityKey を作成します。いい感じです。

コードは次のとおりです(これはおそらくより少ない手順で実行できますが、これが機能することはわかっています):

var QueryString = "SELECT VALUE RunTimeUIDesigner.INCIDENT  (incident.INCIDENT_NBR,incident.LOCATION,etc"
ObjectQuery<INCIDENT> incidents = orbcadDB.CreateQuery<INCIDENT>(QueryString);
incidents.MergeOption = MergeOption.PreserveChanges;
List<INCIDENT> retrievedIncidents = incidents.ToList<INCIDENT>();
orbcadDB.INCIDENTs.Attach(retrievedIncidents[0]);
iNCIDENTsViewSource.Source = retrievedIncidents;
于 2012-09-20T02:14:48.280 に答える