如何在实体框架代码优先级中使用字符串主键延迟加载子对象?

时间:2014-01-23 14:28:39

标签: c# linq entity-framework ef-code-first entity-framework-5

我有一个引用对象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")

1 个答案:

答案 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>
    }