2009-10-07 4 views
1

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

я буду об этом право путь? Любые советы будут очень признательны.

ответ

1

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

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

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

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

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

+0

Так что, если я использую «.Include», я не могу включить несколько таблиц или отношений? Например: Пользователь user = db.User.Include («Бизнес»). Включить («UserRoles»). FirstOrDefault (u => u.UserId == userId); – Victor

+0

Обратите внимание, что Include не может загружать бизнес (Include - это «подсказка»/запрос, а не команда), и вам абсолютно необходимо сохранить код IsLoaded/Load. Кроме того, вы можете складывать несколько включений. –

+0

Итак, если я использую Include, в моем контроллере я могу теперь использовать что-то вроде этого: user.Business.BusinessName.ToString(); после загрузки моего объекта пользователя. Зачем мне также использовать код IsLoaded/Load? – Victor

0

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

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

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

+0

Я не думаю, что это действительно исправляет исходный код, так как запрашивает интересную загрузку в дополнение к тому, что сделал исходный код.Проверка исходных сгенерированных SQL-запросов была бы единственным способом определить, какой из них завершился «лучшим» результатом. –

0

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

  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 возвращал дату a, которая вам не нужна, например свойства пользователя или бизнеса, которые вы не собираетесь отображать в представлении.
  • Ваше мнение теперь не доступно из вашей модели сущности. Они могут развиваться самостоятельно.
+0

Очень хорошее предложение, я ценю ввод! Я думаю, что это очень хорошая рекомендация и может быть тем, что я действительно использую. Должен ли я использовать «.Include», чтобы иметь доступ к u.Business.BusinessName? – Victor

+0

Нет. При проектировании нет необходимости включать. –

Смежные вопросы