2012-07-30 62 views
3

我有以下實體模型:實體框架設置ID時,它不應該

Entity Model

我加了一堆任務,並開始處理這些任務。完成每個任務後,我想記錄有關它的信息。

我用下面的代碼這樣做:

TASK scheduledTask = entities.TASKs.First(x => x.TASK_NAME == e.ClassName); 
scheduledTask.NEXT_RUN = e.NextRun; 
entities.SaveChanges(); 

TASK_LOG logMsg = new TASK_LOG() 
{ 
    TASK = scheduledTask, 
    MESSAGE = e.TaskResult.Message, 
    STATUS = e.TaskResult.Status ? "Successful" : "Failure", 
    TIMESTAMP = e.CompletedTime 
}; 
entities.TASK_LOG.AddObject(logMsg); 
entities.SaveChanges(); 

不過,我得到一個例外,說明我不能修改TASK_LOG對象的ID屬性。我看不到我的代碼將如何修改logMsg對象ID屬性。

注意:兩個實體中的ID屬性由數據庫生成並設置爲StoreGeneratedPattern - Identity。

編輯:

第2輪 - 現在,我得到一個錯誤關於有第一SaveChanges調用打開連接/ avaliable。

第3次運行 - 獲取錯誤存儲更新,插入或刪除語句影響了意外數量的行(0)。在最後的SaveChanges打電話。

這種錯誤不一致使它很難解決。

+0

AddObject不需要的是什麼?我創建了一個TASK_LOG對象,但它沒有附加到與數據庫相關的任何東西,直到我將它添加到實體中。 看到我編輯的帖子關於錯誤。 – Justin 2012-07-30 21:13:19

+0

我在想你需要做的事:entities.TASK.AddObject(scheduledTask);在第一次.SaveChanges之前;然後刪除entities.TASK_LOG.AddObject(logMsg); – MikeTWebb 2012-07-30 21:23:35

+0

@MikeTWebb不,「TASK scheduledTask」已經連接,不需要重新添加。 – CodeCaster 2012-07-30 21:38:17

回答

0

我懷疑這個問題可能是因爲您在通過AddObject附加到上下文之前設置了logMsg.TASK屬性。既然你有權訪問外鍵,我建議使用TASK_ID屬性而不是TASK導航屬性來創建引用。請嘗試用此代碼代替您的logMsg:

TASK_LOG logMsg = new TASK_LOG() 
{ 
    TASK_ID = scheduledTask.ID, 
    MESSAGE = e.TaskResult.Message, 
    STATUS = e.TaskResult.Status ? "Successful" : "Failure", 
    TIMESTAMP = e.CompletedTime 
}; 
+0

我在創建TASK將其添加到上下文中的代碼未顯示之前進行保存更改。至於你的示例代碼,我試圖做到這一點也無濟於事。 – Justin 2012-08-02 11:27:59