【问题标题】:Load child entities in Entity Framework在实体框架中加载子实体
【发布时间】:2012-08-17 10:51:31
【问题描述】:

我有这些 POCO 课程:

public class  Task
    {
        public int TaskId { get; set; }
        public int ProjectId { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime? DueDate { get; set; }
        public int UserId { get; set; }
        public string Tags { get; set; }
        public string FileName { get; set; }
        public virtual Project Project { get; set; }
        public virtual List<TaskAssigned> TaskAssigns { get; set; }
        public virtual List<TaskComment> TaskComments { get; set; }
        public virtual User User { get; set; }
    }

 public class User
    {
        public int UserId { get; set; }
        public string Name { get; set; }
        public int AccountId { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
        public bool IsAdmin { get; set; }
        public virtual Account Account { get; set; }
    }

public class TaskComment
    {
        public int TaskCommentId { get; set; }
        public int TaskId { get; set; }
        public int UserId { get; set; }
        public string Comment { get; set; }
        public string FileName { get; set; }
        public virtual User User { get; set; }
    }

    public class TaskAssigned
    {
        public int TaskAssignedId { get; set; }
        public int TaskId { get; set; }
        public int UserId { get; set; }
        public virtual User User { get; set; }
    }

我已尝试按 Id 获取任务并为此任务加载所有相关实体,但 TaskComment 和 TaskAssigned 的用户实体对于任务实体中的用户以外的其他用户为空:

public Task GetTaskById(int taskId)
    {
        return context.Tasks.Include("TaskAssigns").Include("TaskComments").Include("User").Where(t => t.TaskId == taskId).FirstOrDefault();
    }

【问题讨论】:

    标签: c# entity-framework poco


    【解决方案1】:

    Include 中的“路径”是包罗万象的,这意味着您可以指定用.(点)分隔的多个属性,EF 将包含“属性路径”的所有部分。

    在你的情况下这应该有效:

    public Task GetTaskById(int taskId)
    {
        return context.Tasks
                   .Include("TaskAssigns.User")
                   .Include("TaskComments.User")
                   .Include("User").Where(t => t.TaskId == taskId).FirstOrDefault();
    }
    

    【讨论】:

    • 刚刚了解到我可以将 (dot) 方法与其他使用 lambda 的 .Includes 一起使用。非常有帮助,因为 lamba 表达式似乎看不到子实体的子实体。
    【解决方案2】:

    如下更改上下文属性

    context.DataContext.ContextOptions.ProxyCreationEnabled = true; 
    context.DataContext.ContextOptions.LazyLoadingEnabled = true;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      相关资源
      最近更新 更多