web-dev-qa-db-ja.com

Entity Frameworkでモデルを更新しようとすると、「DefiningQueryがあるためにEntitySetを更新できません...」という例外が発生するのはなぜですか?

Entity Frameworkを使用してLINQto SQLを使用して更新しているときに、例外がスローされます。

System.Data.UpdateException: Unable to update the EntitySet 't_emp' because it has 
a DefiningQuery and no <UpdateFunction> element exists in the   
<ModificationFunctionMapping>

更新のコードは次のとおりです。

public void Updateall()
    {
        try
        {


            var tb = (from p in _te.t_emp
                      where p.id == "1"
                      select p).FirstOrDefault();
            tb.ename = "jack";

            _te.ApplyPropertyChanges(tb.EntityKey.EntitySetName, tb);
            _te.SaveChanges(true);
        }
        catch(Exception e)
        {

        }
    }

なぜこのエラーが発生するのですか?

24
Thomas Mathew

問題はテーブル構造にありました。 エラーを回避するには、テーブルに1つの主キーを作成する必要があります。その後、edmxを更新します。問題は修正されます

51
Thomas Mathew

三つのこと:

  1. 処理できない例外をキャッチしないでください。可能な限りすべての例外をキャッチし、それに対して何もしません(飲み込むことを除いて)。それは悪いことです™何かがうまくいかない場合、本当に静かに何もしたくないですか?これにより、デバッグが困難な破損状態が発生します。良くない。

  2. Linq to SQLは、EntityFrameworkと同様にORMです。 LINQを使用してオブジェクトを更新している可能性がありますが、Linq to SQLを使用しておらず、Entity Framework(Linq to Entities)を使用しています。

  3. 解決策を試しましたか ここで概説 ?あなたが投稿した例外は多少カットされているので、完全に同じかどうかはわかりません(そうでない場合は投稿を更新してください)。同じである場合は、次のことが機能するかどうかについてコメントできますか?君は?

"[..] Entity Frameworkは、特定のビューが更新可能かどうかを認識しないため、フレームワークが更新不可能なビューに対してクエリを生成しようとするのを防ぐために、<DefiningQuery>要素を追加します。

ビューが更新可能である場合は、。edmxのStorageModelセクション内のビューのEntitySet定義から<DefiningQuery>要素を削除するだけです。 、および通常の更新処理は、他のテーブルと同様に機能します。

ビューが更新できない場合は、「変更関数のマッピング」を使用して自分で更新ロジックを提供する必要があります。変更関数マッピングは、.edmxのStorageModelセクションで定義された関数を呼び出します。その関数には、データベース内のストアドプロシージャの名前と引数が含まれている場合があります。または、「定義コマンド」を使用して、StorageModel内の関数定義に挿入、更新、または削除ステートメントを直接書き込むことができます。 .edmxのセクション。 "(Emphasis mine、post formated for clear and Stack Overflow)

(出典: "Mike" on [〜#〜] msdn [〜#〜]

8
George Stocker

ただし、MVC Asp.netを使用する場合は、モデルに主キーを設定できます

テーブルでmodel.edmxを開き、フィールドプロパティに移動して、Entity Key = Trueを設定します。

0
porya_ras