我有一个引用对象User
的对象State
。外键是string
的{{1}}并且是可选的。用户无需引用StateID
。我的课程定义如下
State
当我尝试执行linq查询以获取某些用户及其状态时,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;}
}
对象始终为null。我当然得到了我的用户的StateID,所以我知道这是正确设置的。
我的查询如下:
State
还尝试添加var users = userRepo.where(x => x.StateID != null);
来执行延迟加载,这也不起作用。
我尝试在.ToList()
中[key]
添加StateID
注释但没有运气。
我也试过放弃延迟加载并在我的查询中使用State
也没有运气。
关于我做错了什么的线索?
更新 我还试图明确指定映射如下:
include("State")
答案 0 :(得分: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>
}