2012-02-15 67 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是一个有很多有用的想法的帖子。