无法获得实体属性

时间:2017-12-04 15:46:42

标签: c# asp.net asp.net-mvc entity-framework

我的Db存在问题,我现在才知道,当我开始在网络api工作时。

我的 USER 实体:

public class User { get; set; }
{
    public int UserId { get; set; }
    public string Name { get; set; }
}

这是 ACTIVITY

public class Activity

{
    public int ActivityId { get; set; }
    public User User { get; set; }
}

我添加了一项活动并签入了SSMS。一切似乎都很好,有一个名为UserId的字段存储id。我的问题是当我尝试从活动获取用户时,因为我不断获取空对象。我没有在 DbContext 中设置任何特殊内容。

这是我尝试从Activity对象中获取用户的地方:

public ActionResult ActivityAuthor(int activityId)
{
    Activity activityItem = unitOfWork.Activity.Get(activityId);   
    return Json(unitOfWork.User.Get(activityItem.User.UserId));
}

用户与活动之间的关系
enter image description here

2 个答案:

答案 0 :(得分:1)

我的通灵调试功能告诉我,如果没有Activity用户

,我会查询Include
using System.Data.Entity;

...

var activities = context.Activities
    .Include(x => x.User)
    .ToList();

或者,如果您选择Include的属性作为查询的一部分,则不需要User

var vms = context.Activities
    .Select(x => new ActivityVM() {UserName = x.User.Name})
    .ToList();

答案 1 :(得分:1)

Activity类的User属性应标记为virtual。它使实体框架能够围绕属性创建代理并更有效地加载它。

在代码中的某处,您应该使用类似的加载方法:

using (var context = new MyDbContext())

{
    var activity = context.Activities
                        .Where(a => a.ActivityId == id)
                        .FirstOrDefault<Activity>();

   context.Entry(activity).Reference(a => a.User).Load(); // loads User

}

这应该加载User对象,你的代码中不会为null。

查看此链接以获取更多信息msdn