2017-02-19 43 views
1
// Inside an action result 
tp = dbContext.tp.Single(x => ...); 

foreach (Sample sample in tp.samples) 
{ 
    if (sample.SampleStatusId == 1) 
     changeSamplestatus(sample, 2, now); //change samples to on hold 
} 

dbContext.SaveChanges(); 

public void changeSamplestatus(Sample sample, int sampleStatus, DateTime now) 
{ 
    sample.SampleHistory.Add(new SampleHistory 
    { 
     OldStatus = sample.SampleStatusId, 
     NewStatus = sampleStatus, 
    }); 

    sample.SampleStatusId = sampleStatus; 
} 

我有一個實體(樣本),我想改變它的狀態。EF修改函數中的實體

我正在調用一個函數來做這件事,但實體沒有被修改(但它正在用正確的FK在歷史表中創建一個新行)。

調用SaveChanges時不會引發任何錯誤。它只是不修改實體。

+0

哪個EF版本是這樣的? –

+0

你寫的代碼會插入samplehistory記錄。如果您想更新歷史記錄表格,那麼您應該閱讀該歷史記錄,然後進行更新。然後,您可以將EntityState屬性更改爲進行更新 –

回答

0

你可以試試:

//INSIDE AN ACTION RESULT 
var tp = dbContext.tp.SingleOrDefault(x => ...); 

if (tp != null) 
{ 
    foreach (Sample sample in tp.samples) 
    { 
     if (sample.SampleStatusId == 1) 
      changeSamplestatus(sample, 2, DateTime.Now); 
    } 

    int flag = dbContext.SaveChanges(); 
    if (flag > 0) 
    { 
     // update successful 
    } 
} 

public void changeSamplestatus(Sample sample, int sampleStatus, DateTime now) 
{ 
    //sample.SampleHistory.Add(new SampleHistory 
    //{ 
    // OldStatus = sample.SampleStatusId, 
    // NewStatus = sampleStatus, 
    //}); 
    sample.SampleStatusId = sampleStatus; 
} 

不要使用Single對於這種情況,因爲如果沒有結果發現或有超過1分的結果會拋出異常。改爲使用SingleOrDefaultFirstOrDefault

+0

我的問題完全是其他問題。 –

+0

@yogevgershon您的目標是? –

-1

你可以試試這個。我希望他能工作。想法是首先在歷史環境中獲取歷史記錄,然後更新屬性並設置狀態爲mofifed。請嘗試我沒有測試它,但它應該工作。

public void changeSamplestatus(Sample sample, int sampleStatus, DateTime now) 
    { 
      var historyRecordToUpdate = db.SampleHistory.FirstOrDefault(h=>h.id == sampleHistoryId) 
    if(historyRecordToUpdate !=null) 
    { 
     db.Entry(sample).State= EntityState.Modified; 
    sample.SampleStatusId = sampleStatus; 
} 
}