2016-05-13 11 views
2

私はデータベースの最初のアプローチでエンティティのフレームワークに取り組んでおり、私は以下の問題に遭遇しました。Entity Framework 5/6で部分的な更新を行う方法は?

私はカラムcol1、col2、col3、....、col8を持つCustomerテーブルを持っています。私はこのテーブルのエンティティを作成しました。このテーブルにはすでに100レコードがあります。 8つ以上の列のうち、col4はNULL以外としてマークされます。私のアプリケーションで

Class Customer 
    { 
     member col1; 
     member col2; 
     member col3; 
     member col4; 
     . 
     . 
     member col8; 
    } 
    class Main 
    { 
     //main logic to read data from database using EF 
     Customer obj = object of Customerwith values assigned to col1,col2 and col3 members 
     obj.col2=some changed value. 
     DBContext.SaveChanges(); //<- throws an error stating it is expecting value of col4. 

    } 

は、私だけ返しCOL1、COL2とCOL3 EFおよびストアドプロシージャを使用してストアドプロシージャを使用してレコードの1を読みしようとしています。 col2の変更された値を保存し、DBContextを使用してデータベースに保存しようとしました。しかし、必要なフィールドcol4の値が提供されていないことを示すエラーが表示されます。

参考:私はSaveChangesで無効になっている問題を解決するためのフォーラムと質問とオプションをいくつか試してみましたが、それは実現不可能です。

私は部分的な更新を達成できる他の方法はありますか?

答えて

1

EntityFramework.Utilitiesはあなたの条件を満たすと思います。

このコード:

using (var db = new YourDbContext()) 
{ 
    db.AttachAndModify(new BlogPost { ID = postId }).Set(x => x.Reads, 10); 
    db.SaveChanges(); 
} 

は、単一のSQLコマンドを生成します:SaveChangesメソッドの

exec sp_executesql N'UPDATE [dbo].[BlogPosts] 
SET [Reads] = @0 
WHERE ([ID] = @1) 
',N'@0 int,@1 int',@0=10,@1=1 
+0

私はこの1つを持ってみましょう、結果に更新されます。 – atp9

+0

@ atp9、こんにちは!あなたの進歩はどうですか? =) –

0

無効verficationはそれが

確かに私にとっては現実的ではありません。 にもがあると、保存時の検証が無効になります。しかし、エンティティ全体を変更したものとしてマークすることはできません。個々のプロパティを変更したものとしてマークする必要があります。

var mySmallCustomer = someService.GetCustomer(); // from sproc 
mySmallCustomer.col2 = "updated"; 

var myLargeCustomer = new Customer(); 
context.Customers.Attach(myLargeCustomer); 
Entry(myLargeCustomer).CurrentValues.SetValues(mySmallCustomer); 

// Here it comes: 
Entry(myLargeCustomer).Property(c => c.col2).IsModified = true; 

context.Configuration.ValidateOnSaveEnabled = false; 
context.SaveChanges(); 

「小さい」顧客を取得するだけで十分です。このオブジェクトから、1つのプロパティの更新に使用されるスタブエンティティmyLargeCustomer)を作成します。

関連する問題