Asp.net mvc 如何将带有FK关系(EF)的查询结果传递给视图

Asp.net mvc 如何将带有FK关系(EF)的查询结果传递给视图,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我无法在ASP.NET MVC中理解这个简单的事情: 我有两张桌子: Customer: CustomerID FirstName LastName AddressID AddressTemporaryID Address: AddressID Street City 我在DB中设置了relationsFK,并尝试使用实体框架。我的导航属性FK是命名地址和地址1。 我创建了存储库: public interface

我无法在ASP.NET MVC中理解这个简单的事情:

我有两张桌子:

  Customer:
    CustomerID
    FirstName
    LastName
    AddressID
    AddressTemporaryID

  Address:
    AddressID
    Street
    City
我在DB中设置了relationsFK,并尝试使用实体框架。我的导航属性FK是命名地址和地址1。 我创建了存储库:

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

  public class CustomerRepository : MvcApplication2.Models.ICustomerRepository {
    public IQueryable<Customer> FindAllCustomers() {
      return db.Customers;
    }
  } 
但我如何才能访问我视图中的值?我可以在模型中看到带有Intellisense的item.adress.Street/item.adresse1.Street,但当我尝试时, 我得到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>
<% } %>
我完全迷路了。我试着到处搜索,但没有成功。

你确定吗

 var query = customerRepository.FindAllCustomers(); 

工作正常吗?您是否在控制器端检查过查询是否已填充?您应该编写一些单元测试,但至少在该行上设置一个断点,并查看查询是否正确填充。

EF不会自动延迟加载

您需要手动加载对查询等多结果集不可行的相关对象,或者指示EF为整个查询包含所需的属性:

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

如果您在中习惯了EF和LinqtoSQL,您可以找到如何进行比较。无论如何,它至少会向您显示EF语法。

实际上,在您的场景中,AddressId和Address1Id是表中的FKs:

而实际引用地址和地址1不会加载,除非您执行Include或显式AddressReference.Load

实际FK值将加载到实体中,并加载到EntityReference的EntityKey中,即

addressID = item.AddressReference.EntityKey.EntityKeyValues[0].Value;
希望这有帮助
Alex

嗨,是的,它工作正常。当我删除视图中的地址行时,视图中的数据将正确显示。有可能是我在重写的时候在某个地方打错了字,因为我原来是用我的母语写的。嗨,看起来这就是魔法。我试过了,它似乎起作用了。但我发现了另一个问题。当某个客户没有AddressTemporaryCustomer.AddressTemporaryID==Null时,我也会得到NullReferenceException。这很有意义。绑定算法尝试访问Addresses1属性上的Street属性,该属性返回空引用。您应该尝试使用类似Html.Encodeitem.adresse1==null,item.adresse1.Street在你的表情中哇,它现在就像一个符咒。就我自己而言,我很快就会到达另一个断点,呵呵。谢谢你的帮助。
addressID = item.AddressReference.EntityKey.EntityKeyValues[0].Value;