如何使用LINQ to SQL插入行的副本(带有新标识)?

时间:2011-02-16 21:13:16

标签: c# asp.net linq-to-sql

我有很多桌子,它们共同构成了一个人可以接受的“测试”。一个人可以采用多种类型(脚本)的测试。我正在编写一个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错误。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

警告:丑陋的hacky未经测试的可能性

如何将id设置为null?

newScript.TestScriptId = null
db.TestScripts.InsertOnSubmit(newScript);

答案 2 :(得分:0)

嗯,我看到两种方式:

  1. 只需制作一个“复制”功能,复制所有属性
  2. 使用反射自动复制具有[column]属性的所有属性(多少有点硬核,如果你让它工作的话,可能是不太神奇的)
  3. 网上有一些“神奇”的功能,说他们可以做到,但我更喜欢1号,并且自己完全控制。

    另外:问问自己这是你正在使用的正确的数据库模式,你需要复制整个树,如果一个人做出改变 - 可能是数据库更改,可以让你更容易吗?