2011-02-16 47 views
1

我有许多表格,这些表格一起构成了某人可以采用的“测试”。测试人员可以采用多种类型(脚本)。我正在编辑一个Edit函数,它允许有人编辑Test Questions。我希望这些编辑后的问题能够显示在所有这种类型的新测试中,但在查看过去的测试分数时仍然会显示旧的问题。
为此,每个“测试”都有一个TestId自动增量标识(及其名称)。在编辑测试时,我想用新的TestId复制测试,并提出编辑问题。如何使用LINQ to SQL插入一行(使用新身份)的副本?

那么,使用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. 只是做一个“做副本”功能,副本遍布
  2. 使用反射的属性,以全自动的所有属性与[专栏]复制属性(这是一点点硬核,并可以是神奇的,如果你得到它的工作)

有一些“神奇”的功能在网络上浮动,这就是说他们可以做到这一点,但我更喜欢1号,并且完全控制自己。

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

1

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

如何设置id为空?

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

这没有奏效。 – Marcus 2011-02-16 21:31:15

+0

我确实说这是哈克!随时downvote.Same错误的方式? – MrBliz 2011-02-16 21:41:26