2009-05-04 49 views
1

我無法弄清楚在ASP.NET MVC這個簡單的事情查詢結果:如何通過與FK關係(EF)來查看

我有兩個表:

Customer: 
    CustomerID 
    FirstName 
    LastName 
    AddressID 
    AddressTemporaryID 

    Address: 
    AddressID 
    Street 
    City 

我讓我的關係(FK)在數據庫中設置並嘗試使用實體框架。我的導航屬性(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與智能感知的模型,但是當我會嘗試, 我得到的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> 
<% } %> 

我完全喪失。我試圖到處搜索,但沒有取得任何成功。

回答

0

EF不會自動執行延遲加載。

您需要手動加載相關對象(對於多個結果集像您的查詢不可行),或指示EF包含了整個查詢所需的性能:

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

你可以找到一個在this post中比較EF和LinqtoSQL之間如何做到這一點(如果你習慣了)。無論如何,它至少會向你展示EF語法。

雖然實際引用(地址和地址1)未加載,除非你要麼做一個Include()或顯式AddressReference.Load().

的:

+0

嗨,看起來這是「魔法」。我試過了,它似乎在工作。但我發現了另一個問題。當某些客戶沒有AddressTemporary(Customer.AddressTemporaryID == Null)時,我也會得到那個NullReferenceException。 – user101096 2009-05-04 20:13:33

0

你肯定

var query = customerRepository.FindAllCustomers(); 

正常工作?你在控制器端檢查過查詢實際上是否已填充?您應該編寫一些單元測試,但至少應在該行上設置斷點,並查看查詢是否正確填充。

+0

嗨,是的,它工作正常。當我在View中刪除地址行時,View中的數據顯示正確。我可能在改寫它時犯了一些錯誤,因爲我最初是用我的母語寫的。 – user101096 2009-05-04 20:06:51

0
在您的方案,其中 AddressIdAddress1Id在表FKS

其實實際FK值加載到實體到的EntityReference的的EntityKey即

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

希望這有助於 亞歷克斯