Как передать результаты запроса с отношениями FK (EF) в представление - PullRequest
1 голос
/ 04 мая 2009

Я не могу понять эту простую вещь в ASP.NET MVC:

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

  Customer:
    CustomerID
    FirstName
    LastName
    AddressID
    AddressTemporaryID

  Address:
    AddressID
    Street
    City

У меня установлены отношения (FK) в БД, и я пытаюсь использовать Entity Framework. Мои навигационные свойства (FK) называются Адреса и Адреса1. Я создал хранилище:

  public interface ICustomertRepository {
    IQueryable<Customer> FindAllCustomers();
  }

  public class CustomerRepository : MvcApplication2.Models.ICustomerRepository {
    public IQueryable<Customer> FindAllCustomers() {
      return db.Customers;
    }
  } 

И мой HomeController имеет это:

  public ActionResult Index()
  {
    var query = customerRepository.FindAllCustomers();
    return View(query);
  }

Но как мне получить доступ к значениям в моем представлении? Я могу видеть item.Adresses.Street / item.Adresses1.Street с Intellisense в модели, но когда я попробую, Я получаю исключение NullReferenceException:

<% foreach (var item in Model)
   { %>
<tr>
    <td>
        <%= Html.Encode(item.FirstName) %>
    </td>
    <td>
        <%= Html.Encode(item.Surname) %>
    </td>
    <td>
        <%= Html.Encode(item.Adresses.Street) %>
    </td>
    <td>
        <%= Html.Encode(item.Adresses1.Street) %>
    </td>
</tr>
<% } %>

Я полностью потерян. Я пытался искать везде, но безуспешно.

Ответы [ 3 ]

0 голосов
/ 04 мая 2009

EF не выполняет автоматическую отложенную загрузку.

Вам необходимо либо вручную загрузить связанные объекты (неосуществимо для множественного набора результатов, например, вашего запроса), либо указать EF включить требуемые свойства для всего запроса:

public IQueryable<Customer> FindAllCustomers() {
    return db.Customers.Include("Adresses").Include("Adresses1");
  }

Вы можете найти сравнение того, как это сделать между EF и LinqtoSQL (если вы к этому привыкли) в этом посте . По крайней мере, он покажет вам синтаксис EF для этого.

0 голосов
/ 05 мая 2009

На самом деле в вашем сценарии, где AddressId и Address1Id - это FK в таблице:

Хотя фактические ссылки (Адрес и Адрес1) не загружаются, если вы не выполните Include() или явное AddressReference.Load().

Фактическое значение FK загружается в Entity в EntityKey EntityReference, т.е.

addressID = item.AddressReference.EntityKey.EntityKeyValues[0].Value;

Надеюсь, это поможет Alex

0 голосов
/ 04 мая 2009

Вы уверены, что

 var query = customerRepository.FindAllCustomers(); 

работает нормально? Вы проверили на стороне контроллера, что запрос фактически заполнен? Вам следует написать несколько модульных тестов, но, по крайней мере, установить точку останова в этой строке и посмотреть, правильно ли заполнен запрос.

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