2012-02-15 111 views
1

我目前正在研究基於位於不同服務器上的兩個數據庫的沙箱環境。我打算做的是讓我的客戶在測試服務器上進行更改,然後一旦批准,我可以簡單地點擊按鈕並將數據導入到我的實時數據庫中。使用LINQ更新主鍵

到目前爲止,我已經設法將數據移植到兩個數據庫中,但是我想要做的是修改測試服務器上的主鍵以匹配在活動中保留的主鍵(因爲我需要備份,所以我可以進行檢查以停止多次複製相同的信息)。

到目前爲止,我已經嘗試此解決方案:

DT_SitePage OldPage = new DT_SitePage 
       { 
        PageID = SP.PageID 
       }; 

       DT_SitePage NewPage = new DT_SitePage 
       { 
        PageID = int.Parse(ViewState["PrimaryKey"].ToString()) 
       }; 

       Sandbox.DT_SitePages.Attach(NewPage, OldPage); 
       Sandbox.SubmitChanges(); 

不過,我不斷收到錯誤:

***Value of member 'PageID' of an object of type 'DT_SitePage' changed. 
A member defining the identity of the object cannot be changed. 
Consider adding a new object with new identity and deleting the existing one instead.*** 

反正在LINQ避免這種錯誤,並迫使數據庫更新此字段???

非常感謝

回答

0

你爲什麼不使用股票備份的數據庫廠商提供/恢復功能?

高級ORM工具不允許您更改記錄的主鍵,因爲它們只通過其主鍵標識記錄,這是非常合理的。

您應該考慮直接從您的代碼向數據庫查詢UPDATE查詢。

無論如何,更改主鍵是一個壞主意,是什麼阻止您將它與所需的值放在首位呢?

1

如上所述,修改主鍵通常是您不想做的事情。如果Linq-to-sql沒有預警,你的RDBMS可能會抱怨(SQL服務器!)。特別是當記錄與外鍵約束相關時,更新主鍵不是微不足道的。

在交叉數據庫場景中,使用某些GUID可能執行的「全局」唯一標識更爲常見。也許你的數據可以用另一種方式來識別? (就像兩個用戶具有相同名稱時一樣)。

如果您不需要保持數據庫結構完全相同,則可以考慮在測試數據庫中使用額外的字段來存儲「活動」主鍵。

Here是一個有很多有用的想法的帖子。