最初にクエリを実行せずにレコードを更新しますか?

Attach() メソッドを使用する必要があります。

オブジェクトの取り付けと取り外し


データストアのコンテキストを使用して、データベースに対してダイレクト SQL を使用することもできます。例:

dataEntity.ExecuteStoreCommand
   ("UPDATE items SET itemstatus = 'some status' WHERE id = 123 ");

パフォーマンス上の理由から、単一のハードコードされた SQL 文字列ではなく、変数を渡すことが必要な場合があります。これにより、SQL Server はクエリをキャッシュし、パラメーターで再利用できます。例:

dataEntity.ExecuteStoreCommand
   ("UPDATE items SET itemstatus = 'some status' WHERE id = {0}", new object[] { 123 });

更新 - EF 6.0 用

dataEntity.Database.ExecuteSqlCommand
       ("UPDATE items SET itemstatus = 'some status' WHERE id = {0}", new object[] { 123 });

コード:

ExampleEntity exampleEntity = dbcontext.ExampleEntities.Attach(new ExampleEntity { Id = 1 });
exampleEntity.ExampleProperty = "abc";
dbcontext.Entry<ExampleEntity>(exampleEntity).Property(ee => ee.ExampleProperty).IsModified = true;
dbcontext.Configuration.ValidateOnSaveEnabled = false;
dbcontext.SaveChanges();

結果の TSQL:

exec sp_executesql N'UPDATE [dbo].[ExampleEntities]
SET [ExampleProperty ] = @0
WHERE ([Id] = @1)
',N'@0 nvarchar(32),@1 bigint',@0='abc',@1=1

注:

「IsModified =true」行が必要なのは、新しい ExampleEntity オブジェクトを作成すると (Id プロパティが設定されている場合のみ)、他のすべてのプロパティがデフォルト値 (0、null など) を持つためです。 DB を「デフォルト値」で更新する場合、変更はエンティティ フレームワークによって検出されず、DB は更新されません。

例:

exampleEntity.ExampleProperty = null;

「IsModified =true」という行がないと機能しません。これは、空の ExampleEntity オブジェクトを作成したときにプロパティ ExampleProperty が既に null であるためです。この列を更新する必要があることを EF に伝える必要があります。これがこの行の目的です。