Как вставить копию строки (с новой идентификацией), используя LINQ to SQL? - PullRequest
1 голос
/ 17 февраля 2011

У меня есть несколько таблиц, которые вместе составляют «Тест», который кто-то может пройти. Есть несколько типов (сценариев) тестирования, которые человек может пройти. Я работаю над функцией редактирования, которая позволит кому-то редактировать тестовые вопросы. Я хочу, чтобы эти отредактированные вопросы отображались во всех новых тестах этого типа, но все равно отображают старые вопросы при просмотре прошлых результатов тестов.
Для этого каждый «Тест» имеет 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 и скопировать его вручную, а затем вставить его, и база данных выдаст ему новый идентификатор?

Редактировать
Я также попробовал

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 ]

1 голос
/ 17 февраля 2011

Предупреждение: уродливая, не проверенная возможность

Как насчет установки идентификатора на ноль?

newScript.TestScriptId = null
db.TestScripts.InsertOnSubmit(newScript);
1 голос
/ 17 февраля 2011

Является ли часть клонирования над тем, что вы ищете?

http://damieng.com/blog/2009/04/12/linq-to-sql-tips-and-tricks-2

0 голосов
/ 17 февраля 2011

Ну, я вижу два пути для вас:

  1. Просто создайте функцию «сделать копию», которая копирует все атрибуты поверх
  2. Используйте отражение, чтобы автоматически скопировать все свойства с атрибутом [column] (это немного хардкор, и может быть немного волшебным, если вы заставите его работать)

Есть несколько «магических» функций, плавающих по сети, которые говорят, что они могут это делать, но я бы предпочел номер 1, и сам полностью управляю.

Также: спросите себя, действительно ли вы используете правильную схему БД, вам нужно скопировать все дерево, если человек вносит изменения - может быть, изменение БД может облегчить вам этот путь?

...