我目前正在开发基于位于不同服务器上的两个数据库的沙箱环境。我的目标是允许我的客户在测试服务器上进行更改,然后一旦批准,我只需点击一个按钮并将数据导入我的实时数据库。
到目前为止,我已设法将数据移植到两个数据库中,但我想要做的是修改测试服务器上的主键以匹配实时保存的那些(因为我需要备份,所以我可以进行检查以停止多次复制相同的信息)。
到目前为止,我已尝试过这个解决方案:
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 :(得分:0)
为什么不使用DB制造商提供的库存备份/恢复功能?
从逻辑上讲,高级ORM工具不允许您更改记录的主键,因为它们只能通过主键识别记录。
您应该考虑从代码中对DB进行直接UPDATE
查询。
无论如何,更改主键是一个坏主意,是什么阻止了你INSERT
首先使用所需的值?
答案 1 :(得分:0)
如上所述,修改主键通常是您不想做的事情。如果Linq-to-sql没有预警,你的RDBMS可能会抱怨(SQL服务器会这样做!)。特别是当记录与外键约束相关时,更新主键并不容易。
在跨数据库方案中,更常见的是使用GUID可能执行的某些“全局”唯一标识。也许您的数据可以通过其他方式识别? (就像两个用户具有相同名称时一样,它们被视为相同)。
如果您不需要保持数据库结构相同,则可以考虑在测试数据库中使用额外字段来存储“实时”主键。
Here是一篇有很多有用想法的帖子。