3

Linq 2エンティティに関する古い質問です。誰かが解決策を思いついた場合に備えて、もう一度質問しているだけです。選択なしで複数の行が更新される

私はこれを行うクエリ実行したい:

UPDATE dbo.Products WHERE Category = 1 SET Category = 5 

をそして私は、Entity Frameworkの4.3.1でそれをやってみたいです。

これは単なる例ですが、私はちょうど1列に値を変更したいだけのレコードがあります。 Where(...)でDbContextにロードする...(...)を選択し、すべての要素を変更してから、SaveChanges()で保存すると、うまく動作しません。

私はExecuteCommandに固執し、上記のように直接クエリを送信する必要があります(もちろん、再利用可能にする)か、Linq 2 Entities/Fluentからそれを行うもう1つの良い方法がありますか。

ありがとうございます!

+0

あなたは正確にdoesnのかを説明することができますあなたのために働くのか、それともうまくいかないのか?たぶんあなたが試したもののサンプルコードと失敗した方法は? –

+0

"失敗した"ことは何もありません。これはパフォーマンスに関する質問です。私はEFで実行可能であるかどうかわかりません。私は正しいかどうか、または私が逃した何かがあるかどうかの確認を求めています:) –

答えて

0

あなたはまず、あなたが操作ベースを設定している場合

using (var context = new DBContext()) 
{ 
    context.YourEntitySet.Attach(yourExistingEntity); 

    // Update fields 

    context.SaveChanges(); 
} 
+0

申し訳ありませんが、これはあなたの質問の解決策ではありません。 – Yucel

0

の下に、そしてSQLがEFよりもより適しているように、DBからそれをフェッチすることなく、エンティティを更新することができます。

だから、はい - この場合、ExecuteCommandを付けてください。

1

実際にEntity Frameworkで記述できることはありません。ただし、IVEはこのdoesntのを見たものから、(あなたがEntity Framework Extendedようなものを使用することができます

  • (文脈上)あなたはそれを文字列として記述し、.ExecuteSqlCommandとEFを経由して、それを実行することができ、いくつかのオプション、

    1. を持っている素晴らしい持っていますパフォーマンスを)
  • 0

    これはあなたには合っているが、更新を実行するストアドプロシージャを作成してから、そのプロシージャを関数インポートとしてモデルに追加することができます。 UpdateProductsCategoryがインポートストアドプロシージャの名前になり

    using(var dc = new YourDataContext()) 
    { 
        dc.UpdateProductsCategory(1, 5); 
    } 
    

    :次に、あなたは、単一のデータベース呼び出しで更新を行うことができます。

    0

    はい、ExecuteCommand()は、すべての行のデータをフェッチせずに、ChangeTrackerで並べ替えることなく実行する方法です。ただ、例を提供します

    は、すべての行がフェッチさになりますし、行ごとに行わ更新が変更:ちょうど単一の更新

    using (YourDBContext yourDB = new YourDBContext()) { 
         yourDB.Products.Where(p => p.Category = 1).ToList().ForEach(p => p.Category = 5); 
         yourDB.SaveChanges(); 
        } 
    

    using (YourDBContext yourDB = new YourDBContext()) { 
         var sql = "UPDATE dbo.Products WHERE Category = @oldcategory SET Category = @newcategory"; 
         var oldcp = new SqlParameter { ParameterName = "oldcategory", DbType = DbType.Int32, Value = 1 }; 
         var newcp = new SqlParameter { ParameterName = "newcategory", DbType = DbType.Int32, Value = 5 }; 
         yourDB.Database.ExecuteSqlCommand(sql, oldcp, newcp); 
        }