【问题标题】:How to pass query results with FK relations(EF) to the View如何将具有 FK 关系(EF)的查询结果传递给视图
【发布时间】:2009-05-04 19:18:58
【问题描述】:

我无法在 ASP.NET MVC 中弄清楚这个简单的事情:

我有两张桌子:

  Customer:
    CustomerID
    FirstName
    LastName
    AddressID
    AddressTemporaryID

  Address:
    AddressID
    Street
    City

我在数据库中设置了我的关系(FK)并尝试使用实体框架。我的导航属性(FK)被命名为 Addresses 和 Addresses1。 我创建了存储库:

  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);
  }

但是如何访问视图中的值?我可以在模型中看到带有 Intellisense 的 item.Adresses.Street/item.Adresses1.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>
<% } %>

我完全迷路了。我试图到处搜索,但没有成功。

【问题讨论】:

    标签: asp.net-mvc entity-framework


    【解决方案1】:

    EF 不进行自动延迟加载。

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

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

    您可以在this post 中找到 EF 和 LinqtoSQL(如果您习惯的话)之间的比较。无论如何,它至少会向您展示 EF 语法。

    【讨论】:

    • 嗨,看起来这是“魔法”。我试过了,它似乎正在工作。但是我发现了另一个问题。当某些客户没有 AddressTemporary(Customer.AddressTemporaryID==Null) 时,我也会得到那个 NullReferenceException。
    • 这是有道理的。绑定算法尝试访问“Addresses1”属性上的“Street”属性,该属性返回空引用。您应该尝试在您的表达式中使用类似 Html.Encode(item.Adresses1 == null ? "", item.Adresses1.Street) 的内容
    • 哇,它现在就像一个魅力。 据我所知,我很快就会到达另一个“断点”,呵呵。感谢您的帮助。
    【解决方案2】:

    你确定

     var query = customerRepository.FindAllCustomers(); 
    

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

    【讨论】:

    • 嗨,是的,它工作正常。当我删除视图中的地址行时,视图中的数据会正确显示。可能是我在重写时在某个地方打错了字,因为我原来是用我的母语写的。
    【解决方案3】:

    实际上在您的情况下,AddressId 和 Address1Id 是表中的 FK:

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

    实际的 FK 值被加载到 Entity 到 EntityReference 的 EntityKey 中,即

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

    希望这会有所帮助 亚历克斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      相关资源
      最近更新 更多