2017-02-19 46 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; 
} 
}