Asp.net mvc 如何将带有FK关系(EF)的查询结果传递给视图
我无法在ASP.NET MVC中理解这个简单的事情: 我有两张桌子: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
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;