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)
{
}
}
なぜこのエラーが発生するのですか?
問題はテーブル構造にありました。 エラーを回避するには、テーブルに1つの主キーを作成する必要があります。その後、edmxを更新します。問題は修正されます
三つのこと:
処理できない例外をキャッチしないでください。可能な限りすべての例外をキャッチし、それに対して何もしません(飲み込むことを除いて)。それは悪いことです™何かがうまくいかない場合、本当に静かに何もしたくないですか?これにより、デバッグが困難な破損状態が発生します。良くない。
Linq to SQLは、EntityFrameworkと同様にORMです。 LINQを使用してオブジェクトを更新している可能性がありますが、Linq to SQLを使用しておらず、Entity Framework(Linq to Entities)を使用しています。
解決策を試しましたか ここで概説 ?あなたが投稿した例外は多少カットされているので、完全に同じかどうかはわかりません(そうでない場合は投稿を更新してください)。同じである場合は、次のことが機能するかどうかについてコメントできますか?君は?
"[..] Entity Frameworkは、特定のビューが更新可能かどうかを認識しないため、フレームワークが更新不可能なビューに対してクエリを生成しようとするのを防ぐために、
<DefiningQuery>
要素を追加します。ビューが更新可能である場合は、。edmxのStorageModelセクション内のビューのEntitySet定義から
<DefiningQuery>
要素を削除するだけです。 、および通常の更新処理は、他のテーブルと同様に機能します。ビューが更新できない場合は、「変更関数のマッピング」を使用して自分で更新ロジックを提供する必要があります。変更関数マッピングは、.edmxのStorageModelセクションで定義された関数を呼び出します。その関数には、データベース内のストアドプロシージャの名前と引数が含まれている場合があります。または、「定義コマンド」を使用して、
StorageModel
内の関数定義に挿入、更新、または削除ステートメントを直接書き込むことができます。.edmx
のセクション。 "(Emphasis mine、post formated for clear and Stack Overflow)
(出典: "Mike" on [〜#〜] msdn [〜#〜] )
ただし、MVC Asp.netを使用する場合は、モデルに主キーを設定できます
テーブルでmodel.edmxを開き、フィールドプロパティに移動して、Entity Key = True
を設定します。