我有很多桌子,它们共同构成了一个人可以接受的“测试”。一个人可以采用多种类型(脚本)的测试。我正在编写一个Edit函数,允许有人编辑测试题。我希望这些已编辑的问题能够显示在该类型的所有新测试中,但在查看过去的测试分数时仍会显示旧问题。
为此,每个“Test”都有一个TestId
自动增量标识(及其名称)。编辑测试时,我想用新的TestId
复制测试,并提出要编辑的问题。
那么使用LINQ to SQL制作副本并将其插入到表中的最佳方法是什么?这样:
DataContext db = new DataContext(ConnectionString);
//Copy old test into identical new test but with a different script ID
var oldScript = db.TestScripts.Single(ds => ds.TestScriptId == oldScriptID);
var newScript = oldScript;
db.TestScripts.InsertOnSubmit(newScript);
db.SubmitChanges();
当然告诉我,我Cannot add an entity that already exists.
执行此操作的唯一方法是遍历TestScript中的每一列并手动复制,然后插入它,数据库会给它一个新的ID吗?
修改
我也试过了
DataContext db = new DataContext(ConnectionString);
//Copy old test into identical new test but with a different script ID
var oldScript = db.TestScripts.Single(ds => ds.TestScriptId == oldScriptID);
var newScript = new TestScript();
db.TestScripts.InsertOnSubmit(newScript);
db.SubmitChanges();
希望它会创建一个新的空行,然后我可以newScript = oldScript
并提交更改,但它会给我SqlDateTime overflow
错误。
答案 0 :(得分:1)
答案 1 :(得分:1)
警告:丑陋的hacky未经测试的可能性
如何将id设置为null?
newScript.TestScriptId = null
db.TestScripts.InsertOnSubmit(newScript);
答案 2 :(得分:0)
嗯,我看到两种方式:
网上有一些“神奇”的功能,说他们可以做到,但我更喜欢1号,并且自己完全控制。
另外:问问自己这是你正在使用的正确的数据库模式,你需要复制整个树,如果一个人做出改变 - 可能是数据库更改,可以让你更容易吗?