2015-12-15 21 views
0

我嘗試使用EF中的ChangeTracker來執行審計並保存數據庫中的所有更改(add + update)。使用ObjectContext獲取關係記錄的主鍵

因此與ChangeTracker我將能夠獲得所有更改的表和每個值的所有值。但是我還需要新表格中新記錄的ID。

其中有些是關係,當我嘗試EntityKey得到的值,主鍵是0

private object GetPrimaryKeyValue(DbEntityEntry entry) 
{ 
    var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity); 
    return objectStateEntry.EntityKey.EntityKeyValues[0].Value;  
} 

有人知道,如果我在錯誤的方式,如果有可能得到相關實體的主鍵?

謝謝!

+0

我認爲你需要檢查你的數據庫表。如果它是主鍵,則它不能爲空(請參閱http://stackoverflow.com/questions/3876785/sql-server-cant-insert-null-into-primary-key-field)。 – Roger

+0

實際上,我說錯了,它不是null,而是0.主鍵是表中的自動增量字段。 –

回答

0

我認爲你得到0(即default(int)),因爲autoincremented(identity)列只有在保存完成後纔會被填充(即dbContext.SaveChanges已成功完成)。嘗試讀取SaveChanges()之後的值,如建議的here

它看起來像捕捉新增值的方式,您必須重寫SaveChanges並像上面提到的here一樣獲取生成的值。

+0

是的,但我想要做的是將所有新增加的值保存到另一個表中,因爲我使用EF的ChangeTracker檢索了所有這些值。當它涉及到現有數據的更新時,這不是問題,但在這種情況下,它是用於新行並且主鍵是0 –

+0

10我在我的答案中提供了額外的參考。 – Alexei

+0

只是一個小提示:因爲我不喜歡觸發器,所以我喜歡.NET解決方案。但是,請記住,如果表格數據可以由其他應用程序更改而不是您自己的應用程序更改,則觸發器可能更合適。 – Alexei