Понимание многих для многих отношений и Entity Framework - PullRequest
2 голосов
/ 02 июня 2010

Я пытаюсь понять Entity Framework, и у меня есть таблица «Пользователи» и таблица «Страницы». Они связаны во многих отношениях со связующей таблицей «UserPages». Прежде всего, я хотел бы знать, правильно ли я проектирую эти отношения, используя многие ко многим: один пользователь может посетить несколько страниц, и каждую страницу могут посетить несколько пользователей ..., так что я прав в использовании many2many

Во-вторых, и что более важно, поскольку я понял отношения m2m, таблицы User и Page не должны повторять информацию. То есть должна быть только одна запись для каждого пользователя и каждой страницы. Но тогда как в структуре сущностей я могу добавить новые посещения одной и той же страницы для одного и того же пользователя? То есть я подумал, что мог бы просто использовать метод Count () в IEnumerable, возвращаемом запросом LINQ, чтобы получить число посещений пользователем определенной страницы.

Но я не вижу способа сделать это. В Linq to Sql я мог получить доступ к соединительной таблице и добавить туда записи, отражающие добавленные посещения определенной страницы определенным пользователем, столько раз, сколько необходимо. Но в EF я не могу получить доступ к распределительной таблице. Я могу перейти только от пользователя к коллекции страниц и наоборот.

Я уверен, что я неправильно понимаю отношения или что-то в этом роде, но я просто не могу понять, как это смоделировать. Я всегда мог иметь столбец Count в таблице Page, но, насколько я понял, вы не должны разрабатывать таблицы базы данных подобным образом, эти значения должны собираться запросами ...

Пожалуйста, помогите мне понять, что я делаю неправильно ...

1 Ответ

4 голосов
/ 02 июня 2010

Вы делаете все правильно .

В модели данных объекта (EDM) Отношения «многие ко многим» могут быть представлены с или без таблицы объединения , в зависимости от того, содержит ли она некоторые дополнительные поля. См. Статью ниже для более подробной информации.


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

Чтобы добавить посещения определенной страницы на пользователя, вы можете, например, сделать что-то вроде:

using (var context = new YourEntityModelObjectContext())
{
     var page = context.Pages.FirstOrDefault(p => p.Url == "http://someurl");
     var user = context.Users.FirstOrDefault(u => u.Username == "someuser");

     user.Pages.Add(page);

     context.SaveChanges();
}

Или вы можете сделать это с другой стороны отношения:

using (var context = new YourEntityModelObjectContext())
{
     var page = context.Pages.FirstOrDefault(p => p.Url == "http://someurl");
     var user = context.Users.FirstOrDefault(u => u.Username == "someuser");

     page.Users.Add(user);

     context.SaveChanges();
}

В обоих случаях новая запись будет добавлена ​​в таблицу User_Page .

Если вам нужно узнать количество страниц, посещенных конкретным пользователем, вы можете просто сделать:

using (var context = new YourEntityModelObjectContext())
{
     var user = context.Users.FirstOrDefault(u => u.Username == "someuser");
     var visitCount = user.Pages.Count;
}

Связанные ресурсы:

...