Linq-to-sql Добавить элемент и запись «один ко многим» одновременно - PullRequest
1 голос
/ 19 апреля 2010

У меня есть функция, где я могу добавлять статьи, и пользователи могут комментировать их.Это делается с отношением один ко многим, как = "commentId=>ArticleId".Однако, когда я пытаюсь добавить комментарий в базу данных в то же время, когда я добавляю комментарий ко многим записям, commentId не известен.Как этот код:

Comment comment = new Comment();
comment.Date = DateTime.UtcNow;
comment.Text = text;
comment.UserId = userId;
db.Comments.InsertOnSubmit(comment);
comment.Articles.Add(new CommentsForArticle() { ArticleId = articleId, CommentId = comment.CommentId });

Значение commentId будет 0, прежде чем я нажму "отправить".Есть ли какой-нибудь способ избежать необходимости делать промежуточные или мне просто нужно вырезать часть, где у меня есть отношение один ко многим, и просто использовать CommentTable с таким столбцом, как "ArticleId".

Что лучше с точки зрения производительности?

Я понимаю основную проблему, я просто хочу знать, какое решение работает лучше.

1 Ответ

3 голосов
/ 19 апреля 2010

Вы задаете два разных вопроса.

Во-первых, если комментарий может относиться только к одной статье, с точки зрения проектирования базы данных имеет больше смысла иметь ArticleId в таблице Comment вместо создания таблицы ссылок. Таблица промежуточных ссылок обычно используется только для многих: многих отношений, поскольку они не могут быть смоделированы явно и требуют такого уровня косвенности.

При этом, если у вас правильно определены внешние ключи, Linq2SQL обнаружит их и позволит работать с объектами, а не с ключами (или вы можете использовать любой из них). Например, ваша последняя строка может выглядеть примерно так, при условии, что вы оставили дизайн базы данных как есть:

comment.Articles.Add(new CommentsForArticle() { ArticleId = articleId, Comment = comment }

Обратите внимание, что я использую фактический Comment объект, а не его ID. Делая это таким образом, Linq2SQL может автоматически сделать это сопоставление для вас. Если у вас есть дескриптор самой статьи, вы также можете заменить ArticleId = articleID на Article = article.

...