2016-05-13 137 views
2

我正在使用數據庫第一種方法處理實體框架,並且遇到了以下問題。如何在實體框架5/6中實現部分更新?

我有一個客戶表,列col1,col2,col3,....,col8。我爲此表創建了一個實體,並且此表已經有大約100條記錄。在8列之外,col4被標記爲非空。

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. 

    } 

在我的應用程序,我想使用存儲過程使用EF和存儲過程只返回COL1,COL2和COL3讀取記錄的一個。 我想保存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

讓我試着擁有這一個,並會在結果上更新你。 – 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(); 

因此,您看到它足以讓「小」客戶。從此對象中,您創建用於更新一個屬性的存根實體myLargeCustomer)。