使用LINQ更新主键

时间:2012-02-15 09:52:02

标签: c# .net 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中是否有任何方法可以避免此错误并强制数据库更新此字段???

非常感谢

2 个答案:

答案 0 :(得分:0)

为什么不使用DB制造商提供的库存备份/恢复功能?

从逻辑上讲,高级ORM工具不允许您更改记录的主键,因为它们只能通过主键识别记录。

您应该考虑从代码中对DB进行直接UPDATE查询。

无论如何,更改主键是一个坏主意,是什么阻止了你INSERT首先使用所需的值?

答案 1 :(得分:0)

如上所述,修改主键通常是您不想做的事情。如果Linq-to-sql没有预警,你的RDBMS可能会抱怨(SQL服务器会这样做!)。特别是当记录与外键约束相关时,更新主键并不容易。

在跨数据库方案中,更常见的是使用GUID可能执行的某些“全局”唯一标识。也许您的数据可以通过其他方式识别? (就像两个用户具有相同名称时一样,它们被视为相同)。

如果您不需要保持数据库结构相同,则可以考虑在测试数据库中使用额外字段来存储“实时”主键。

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