Проектирование базы данных Linq2SQL: отображение составных / суррогатных ключей - PullRequest
2 голосов
/ 08 апреля 2011

Изображение, которое у меня есть огромная база данных, в которой хранятся темы и сообщения из разных источников данных, таких как два разных форума. Для каждого источника данных идентификатор объекта (например, ThreadId, PostId ...) является уникальным, но он может вступать в конфликт с идентификатором объекта, полученным из других источников данных. Например, и forum1, и forum2 могут иметь тему с Threadid = 1:

Я использую Linq2Sql и шаблон хранилища для подключения моего приложения к базе данных. Я читал, что составных ключей (между ThreadId и DatasourceId) следует избегать при использовании Linq2Sql. Поэтому я предполагаю, что суррогатный первичный ключ - мой единственный вариант (не так ли):

Темы таблиц:

  • UniqueId - int, PK
  • DatasourceId - int
  • ThreadId - int
  • ...

Стол сообщений:

  • UniqueId - int, PK
  • DatasourceId - int
  • PostId - int
  • ThreadId - int, FK to Threads.ThreadId

Теперь мой вопрос: сможет ли Linq2Sql отобразить отношения 1: 1 между сообщениями и потоками в своих сгенерированных классах? Что произойдет, если сообщение имеет внешний ключ для Thread.ThreadId и если есть два объекта с одинаковым ThreadId (но, разумеется, с разными DatasourceIds)? Я думаю, что это вернет коллекцию назначенных тем в сообщении - что я не хочу! Могу ли я как-то по-прежнему возвращать одну ветку для каждого поста, которая имеет тот же DatasourceId?

1 Ответ

0 голосов
/ 08 апреля 2011

Вы правы, что LinqToSql не будет знать, что определенный Threadid уникален.Вы можете сделать это, включив Datasourceid в ваше предложение where в каждом запросе

var myThreads = DataContext.Threads.Where(t => t.Datasourceid == 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...