Почему мои дочерние таблицы не отображаются, когда я выбираю объекты с помощью сопоставления LINQ ORM - PullRequest
0 голосов
/ 06 сентября 2011

Я пытаюсь построить объект, содержащий несколько списков. Объект - сообщение - представлен одной таблицей, а содержащиеся списки представлены одной таблицей каждая.

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

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

Что у меня есть:

  • Одна таблица с именем Messages содержит следующие свойства:

    • Id - uint - автоматически сгенерирован - первичный ключ
    • Сообщение - строка
  • Одна таблица называется Получатели, которая содержит следующие свойства:

    • MessageId - uint - первичный ключ
    • RecipientId - uint - первичный ключ
  • Одна связь между этими двумя. Сообщения родительские, получатели дочерние. Кардинальность один ко многим. Участвующие свойства: Messages.Id -> Recipients.MessageId.

Моя цель - сохранять сообщения. Каждое сообщение должно иметь одного или нескольких получателей. Когда я извлекаю сообщение из таблицы Messages, я хочу, чтобы свойство Recipients (созданное из ассоциации с таблицей Recipients) возвращало мне всех получателей, у которых MessageId равен Id извлеченного сообщения.

Итак, я вставляю в базу данных:

void SendMessage(string message, uint recipient)
{
  var m = new Message { Message = message };
  context.Messages.InsertOnSubmit(m);
  context.SubmitChanges();

  var r = new Recipient { MessageId = m.Id, RecipientId = recipient };
  context.Recipients.InsertOnSubmit(r);
  context.SubmitChanges();
}

Теперь, если я выберу сообщения из таблицы сообщений, я найду сообщение. Его свойство Recipients имеет значение Count = 0. Каким-то образом связь с получателями не создается. Поэтому я должен сделать что-то не так.

Однако - и это действительно смущает меня - если я выбираю получателей из таблицы получателей, я нахожу получателя с правильными MessageId и RecipientId. Платформа ORM также сгенерировала свойство, которое ссылается на родительскую таблицу, и это работает! Свойство Message объекта Recipient фактически ссылается на Message, являющееся его родителем.

Может ли кто-нибудь дать мне подсказку о том, что мне не хватает, чтобы иметь возможность перечислить все дочерние сущности родительской сущности? Или о том, что еще нужно дать мне ответ?

1 Ответ

1 голос
/ 06 сентября 2011
private void SendMessage(string message, uint recipient)
{
    var message = new Message { Message = message };

    //no need to explicit the relation with message
    var r = new Recipient { RecipientId = recipient };
    //add the recipient to message's recipients 
    message.Recipients.Add(r);    

    context.Messages.InsertOnSubmit(message);
    //only one submit is needed
    context.SubmitChanges();
}

Как вы сами выяснили, автоматически сгенерированный класс Message имеет свойство Recipients типа EntitySet<Recipient>, которое в основном является всеми получателями, связанными с этим сообщением.

Если вы добавите получателя в сообщение, которое хотите сохранить, LINQ автоматически свяжет его с соответствующим ключом id при отправке изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...