このトピックに関する多くの質問のどれも、私の状況に一致していないようです。私は大きなデータモデルを持っています。場合によっては、少数のフィールドのみを 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 を使用してエンティティ全体を取得しても変更が保持される場合、フィールドのサブセットが取得されるときに異なる動作をする論理的な目的は何でしょうか? これはバグなのだろうか?