структура сущности: как связать 2 таблицы - PullRequest
1 голос
/ 21 июня 2010

У меня есть следующие таблицы:

Профили:

ProfileID (первичный ключ)
ProfileName и т. Д.

Контакты:

ContactID ((Первичный ключ)
ProfileFromID (внешний ключ)
ProfileToID (внешний ключ)
Message varchar (50) и т. Д.

Профили могут содержать много контактных сообщений.Таким образом, определенное сообщение будет иметь, кто отправил сообщение и кому было отправлено сообщение.

Мне трудно установить связь между двумя таблицами.Его легко подключить Profile.ProfileID к Contact.ProfileIDFrom.

Но я также хочу подключить Profile.ProfileID к Contact.ProfileIDTo

Итак ... позже я хочу выполнить запрос в моих сущностях следующим образом ...

Профиль.MessageFrom даст мне имя профиля и ... Profile.MessageTo даст мне имя профиля ....

Я хочу иметь возможность извлекать имена профилей как для ProfileIDFrom, так и для ProfileIDTo.

Я не уверен, как соединить 2 таблицы.

Ответы [ 2 ]

3 голосов
/ 21 июня 2010

Вам необходимо создать два внешних ключа в базе данных:

-- Creating foreign key on [ProfileFromId] in table 'Contacts'
ALTER TABLE [dbo].[Contacts]
ADD CONSTRAINT [FK_ProfileContactFrom]
    FOREIGN KEY ([ProfileFromId])
    REFERENCES [dbo].[Profiles]
        ([ProfileId])
    ON DELETE NO ACTION ON UPDATE NO ACTION;

-- Creating non-clustered index for FOREIGN KEY 'FK_ProfileContactFrom'
CREATE INDEX [IX_FK_ProfileContactFrom]
ON [dbo].[Contacts]
    ([ProfileFromId]);
GO
-- Creating foreign key on [ProfileToId] in table 'Contacts'
ALTER TABLE [dbo].[Contacts]
ADD CONSTRAINT [FK_ProfileContactTo]
    FOREIGN KEY ([ProfileToId])
    REFERENCES [dbo].[Profiles]
        ([ProfileId])
    ON DELETE NO ACTION ON UPDATE NO ACTION;

-- Creating non-clustered index for FOREIGN KEY 'FK_ProfileContactTo'
CREATE INDEX [IX_FK_ProfileContactTo]
ON [dbo].[Contacts]
    ([ProfileToId]);
GO

Добавьте два свойства навигации в сущность Контакт в вашей модели.Например ProfileFrom и ProfileTo.

Вы можете использовать готовую загрузку для выполнения запросов, подобных этому:

using (var ctx = new TestModelContainer())
      {
            foreach (Contact contact in ctx.Contacts
                                          .Include("ProfileFrom")
                                          .Include("ProfileTo"))
                  {
                         Console.WriteLine("From: {0}, to: {1}, Message: \"{2}\"", contact.ProfileFrom.ProfileName, contact.ProfileTo.ProfileName, contact.Message);
                  }
      }
0 голосов
/ 21 июня 2010

У вас есть 2 связи (с внешним ключом) из Контактов - Профили (* - 1)

Но что касается ORM, вам может понадобиться создать 2 или более различных сущностей (типа?), Которые являются псевдонимами в зависимости от ваших вариантов использования. (Я не знаком с entity-framewrk)

...