Entity Framework - Как работать с табличными отношениями? - PullRequest
1 голос
/ 07 октября 2009

Я разработал довольно маленькое MVC-приложение asp.net, используя шаблон репозитория и Linq to Sql. Теперь я хотел бы получить доступ к тем же данным и обновить их с помощью Entity Framework, однако у меня возникают проблемы с пониманием правильности моего синтаксиса для отношений таблиц в Entity Framework.

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

using (MyDatabaseEntities context = new MyDatabaseEntities())
{
    User user = db.User.FirstOrDefault(u => u.Users.UserId == userId);

    if (!user.BusinessReference.IsLoaded)
    {
        user.BusinessReference.Load();
    }

    return user;
}

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

foreach (Business business in user.BusinessReference)
{
    var b = business;
    ViewData["BusinessName"] = b.BusinessName;                    
}

Правильно ли я поступаю? Любой совет будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 07 октября 2009

За исключением части foreach, которая на самом деле не говорит о том, что вы пытаетесь сделать, поскольку вы находитесь в цикле, перезаписывая ViewData ["BusinessName"], вы в значительной степени на ходу с происходящим.

Если это, скажем, пользователь отображается, и вы хотите также отобразить некоторые BusinessNames, они должны быть доступны в представлении. Скучной вещью с Entity Framework и причиной, по которой я решил временно использовать другие решения, является необходимость загрузки ссылок.

лучшее решение в приведенном вами примере может быть:

using (MyDatabaseEntities context = new MyDatabaseEntities())
{
    return (from u in user.Include("Business")
            where u.UserId == userId
            select u).FirstOrDefault();
}

К сожалению, вы не можете предварительно загружать ссылки глубже, чем это, простым способом, в этом случае вам нужно пройти через весь путь и загрузить.

0 голосов
/ 07 октября 2009

Я бы сделал это:

  1. Создайте модель представления для своего представления и измените представление на строго типизированное представление.
  2. Используйте L2E для проецирования на модель презентации.

Как это:

var model = (from u in Context.Users 
             where u.UserId == userId
             select new UserPresentation
             {
                 UserName = u.Name,
                 BusinessName = u.Business.BusinessName,
                 SomeOtherDatumYourViewNeeds = // ...
             }).FirstOrDefault();

Некоторые важные моменты здесь:

  • Вам не нужно беспокоиться о нетерпеливой загрузке. Необходимые данные всегда будут загружены.
  • Вы не просите SQL Server вернуть дату, которая вам не нужна, например, свойства пользователя или бизнеса, которые вы не собираетесь отображать в представлении.
  • Ваше представление теперь отделено от вашей модели сущности. Они оба могут развиваться независимо.
0 голосов
/ 07 октября 2009

Нет, это не совсем верно. Это было бы больше похоже на это:

User user = db.User.Include("Business").FirstOrDefault(u => u.UserId == userId);

Предполагается, что у вашей сущности пользователя есть свойство навигации с именем Business.

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