2014-01-23 36 views
1

我有一個對象User,它引用了對象State。外鍵是​​的string,並且是可選的。用戶不需要參考State。我定義的類如下如何在實體框架代碼中使用字符串主鍵加載子對象代碼優先?

public class User 
{ 
    public int UserID {get; set'} 
    public string StateID {get; set;} 
    //some other properties 

    public virtual State State {get; set;} 
} 


public class State 
{ 
    public string StateID {get; set;} 
    //other properties 

    public ICollection<User> Users {get; set;} 
} 

當我嘗試做一個LINQ查詢得到一些用戶和他們的國家,State對象總是空。我確實得到了我的用戶的StateID,所以我知道設置正確。

我的查詢看起來是這樣的:

var users = userRepo.where(x => x.StateID != null); 

也嘗試添加.ToList()獲得延遲加載執行它也不管用。

我已經嘗試在State中加入[key]註釋​​,但沒有運氣。

我也試着放棄延遲加載和在我的查詢中使用include("State")也沒有運氣。

任何線索,我做錯了什麼?

UPDATE 我也試圖明確指定映射如下:

modelBuilder.Entity<User>() 
    .HasOptional(t => t.State) 
    .WithMany(b => b.Users) 
    .HasForeignKey(t => t.StateID); 
+0

您能否顯示您的模型配置?你在哪裏設定這兩個班級之間有關係?你是否嘗試使用Include(x => x.State)? –

+0

SQL日誌記錄是否顯示對「State」表的任何訪問? –

+0

@Get Arnold不,我沒有看到SQL輸出中的狀態表的任何連接。思考? – stephen776

回答

1

確保導航屬性在User類正確定義。如下圖所示:

public class User 
    { 
     public int UserID {get; set;}   
     public string StateID {get; set;} 

     //some other properties 
     public State State {get; set;} 
    } 

然後您可以創建使用查詢Include象下面這樣:

var users = userRepo.Where(i => i.StateID != null).Include("State").ToList(); 

更新:

如果您想使用延遲加載來實現這一點,虛擬keyworkd添加到所有導航屬性。

public class User 
{ 
    public int UserID {get; set;} 
    public string StateID {get; set;} 
    public virtual State State{get; set;} 
} 

public class State 
{ 
    public string StateID {get; set;} 
    public string StateName { get; set; } 
    public virtual ICollection<User> Users { get; set; } 
} 

另外,還要確保你沒有在你的DbContext類禁用延遲加載象下面這樣:

this.Configuration.LazyLoadingEnabled = false; // disable Lazy loading 

後續以上步驟,延遲加載應該作品,下面是一個例子:

在你的行動方法中:

ViewBag.Result = userRepo.Users.Where(i => i.StateID != null); 

在你的看法

@foreach (User item in @ViewBag.Result) 
    { 
     <div>@item.State.SomePropertyName</div> 
    } 
+0

那麼你是否說使用導航屬性上的virtual關鍵字進行延遲加載是不可能的? – stephen776

+0

當然可以使用延遲加載。從您提供的代碼中,我沒有看到任何錯誤。它只是給你一個使用Include關鍵字的例子。我更新了我的答案,看看。 – Lin

+0

我在關係的兩端都指定了'virtual',我仍然得到相同的結果。我已經成功地建立了這些類型的關係。我在想這種情況的差別是'string'外鍵 – stephen776