2013-05-04 27 views
5

私はこれを何回もやってきました。Linq-to-SQLを使用してレコードを更新する

私が見つけたすべての例は、私が持っているまさに..です

私は私のクエリを実行...

var result = from u in tdc.tblUsers 
      where u.UserID == userID 
      select u; 

そして私はに私が欲しいの値を変更します。

foreach (tblUsers u in result) 
{ 
    //change values (and no im not changing the primary key or foreign keys) 
} 

変更を提出します。

tdc.SubmitChanges(); 

は、私はまた、この方法の前にそれを試してみましたが、UserIDが主キーであるため、それだけで今までにこのクエリで1つのレコードを取得すると同じエラー

tblUsers result = (from u in tdc.tblUsers 
        where u.UserID == userID 
        select u).Single(); 
result.Address = address; 
result.Phone = phone; 
tdc.SubmitChanges(); 

を持っています。

変更が送信されると、その行が見つからなかったか、変更されたという例外がスローされます。私はこれを使用している唯一の人ですので、dbまたはロックにアクセスすることに他の競合はありません。なぜそれはChangeConflictExceptionを投げますか?私はデバッガを使って歩み始めました。データは、私がしようとしている変更を含めて、プロセス全体を通して持続しています。

+0

Entity Frameworkを使用していますか(もしあれば、どのバージョンですか)? – gunr2171

+0

また、すべてのテーブルに主キーがありますか。これには、編集中のものと、外部キーからの分岐テーブルが含まれます。 – gunr2171

+0

.NET Framework 4とはい、すべてのテーブルにプライマリキーと適切な外部キーがあります。このクエリは1つのテーブルの後に行くだけで、そのテーブルには外部キーがありません。それは私のベーステーブルの一つです。 –

答えて

6

フィールドのいずれかがLinq To SQLデザイナーと実際のデータベースで異なるため、このエラーが発生する可能性があります。

それとも、このarticle

グッドラックの表情を取ることができます!

+0

dbmlを削除し、データソースをリフレッシュして、すべてのテーブルを再度プルしました。プログラムの再実行と例外が発生しませんでした。ありがとうございました。以前にデータベースに行った変更を忘れました。 +1あなたのために –

+0

私も行っていた。それは私に夫婦二分の笑を待たなければならないと私に言った –

2

多分あなたは別のコンテキストで作業しますか?それを使ってカプセル化してみてください。あなたはLINQのツーSQLが生成する実際のSQLを見れば、あなたはそれがあなたのことを、データベースの列に一致するとは本当にオーバー熱心されていることがわかりますかなり頻繁にこの

using (myContext ctx = new myContext()) 
{ 
    var user = ctx.users.first(); 
    user.name="blah"; 
    ctx.SubmitChanges(); 
} 
0

よう

、最初に取り出された。列ID(PK)、A、B、Cを持つ表があるとします。行Cを更新した場合は、一致する主キーで行を更新すれば十分であると考えられます。しかし、Linq-to-SQLも列Aと列Bにもマッチさせようとしていることがよくあります。通常、それは問題ありません。マルチスレッドまたはマルチプロセスからの同時書き込みがない限り、更新しようとしているレコードの列AまたはBが変更されます。これらのSystem.Data.Linq.ChangeConflictExceptionを取得します:行が見つかりませんまたは変更されました。データコンテキストでSubmitChanges()を呼び出すとエラーが発生します。

関連する問題