2017-09-13 120 views
0

所有運行良好,直到我嘗試從Linq一個簡單的SQL Server更新。我的代碼是:Linq更新到SQL

DataClasses1DataContext db = new DataClasses1DataContext("mySQLServer"); 
     db.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["mySQLServer"].ToString(); 

     var results = (from bl in db.a_Bellows_Lots 
         where bl.Job == this.theJob 
         where bl.BellowsLot == this.theLot 
         select bl).SingleOrDefault(); 

     results.Quantity = this.theQuantity; 
     try 
     { 
      db.SubmitChanges(); 
     } 
     catch (Exception ex) 
     { 
      error += " " + ex.Message; 

但值沒有變化。我用LinqPad模擬了這個;

string JobNumber = "A2559038A"; 
string LotNumber = "17213A"; 

var results = (from bl in a_Bellows_Lots 
      where bl.Job == JobNumber 
      where bl.BellowsLot == LotNumber 
      select new 
      { 
       bl.Quantity 
      }).SingleOrDefault(); 

results.Quantity = 1; 

this.SubmitChanges(); 

這給我的設計時錯誤「屬性格式或索引‘AnonymousType#1.Quantity’不能被分配到 - 它是隻讀的。」

我用這個設計模型前,它的工作原理:

  DataClasses1DataContext db = new DataClasses1DataContext("mySQLServer"); 
     db.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["mySQLServer"].ToString(); 

     var results = (from x in db.a_Cleaning_Logs 
         where x.CleaningLogID == CleaningLogID 
         select x).SingleOrDefault(); 

     results.EndTime = EndDate; 
     results.EmployeeOut = employeeOut; 
     results.CleaningDone = cleaningDone; 
     db.SubmitChanges(); 

的區別是什麼;我究竟做錯了什麼?

+1

什麼是實際問題?中間部分給出的例外很好地解釋了那裏的問題。你在問爲什麼最上面的部分沒有改變數據庫? –

+0

第二個肯定會失敗,因爲您將數據庫的結果作爲匿名類型進行投射。第一個看起來應該起作用。當你硬編碼改變值時會發生什麼?你是否有可能將它「改變」到相同的價值? – Jonathan

+0

數量爲3,我將代碼更改爲「results.Quantity = 123;」價值沒有變化。所以我知道我正試圖將其改變爲不同的價值。 –

回答

1

匿名對象是隻讀的。

所以下面應該工作

var results = (from bl in a_Bellows_Lots 
     where bl.Job == JobNumber 
     where bl.BellowsLot == LotNumber 
     select bl).SingleOrDefault(); 

results.Quantity = 1; 

this.SubmitChanges(); 

但如果你使用new { bl.Quantity},而不是返回整個記錄。

如果前者不起作用,那麼也許你的表沒有標識列。

如果您正在使用LinqPad,則可以在提交更改以查看是否有任何更改之前調用this.GetChangeSet().Dump();