在MVC 6中手动加载导航属性

时间:2015-11-07 16:27:17

标签: asp.net-core-mvc entity-framework-core

在MVC 6中手动加载导航属性的最佳方法是什么?

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(Reservation reservation, bool ignoreConflicts = false)
{
    int id = reservation.ItemID;  // correct item ID
    Item item = reservation.Item; // null
}

在此示例中,当用户提交表单时,我得到一个Reservation对象,其所有导航属性都设置为null。

我能想到的最好的方法是手动查找Item DbSet以找到具有匹配ID的项目并将其分配给导航属性。

2 个答案:

答案 0 :(得分:1)

这是一个Entity Framework 7问题,而不是MVC6问题。 懒惰加载尚未针对EF7实施,可能根本不会实现。

您可以在https://github.com/aspnet/EntityFramework/issues/3797

跟踪故障单

这意味着我们需要按照你的建议去做;类似的东西:

Item item = context.Items.FirstOrDefault(x => x.ID == reservation.ItemID);

答案 1 :(得分:1)

嗯,首先要做的是......你正处于MVC行动中。您将收到的将来自客户。不是直接数据库。

所以SELECT DISTINCT locations."id", locations."name", contacts.name FROM locations JOIN contacts ON locations."id" = contacts.location_id 可能不是null,但也可能不是真正的数据。

在这种情况下,您首先必须从服务器检索数据,然后执行以下两项操作之一:

  1. 直接从您从客户端收到的内容手动更新EF7实体
  2. 使用reservation.Item自动更新当前实体。
  3. 可能很简单:

    TryUpdateModelAsync