当从数据库中读取值时,实体框架TPT层次结构不适用于深层次结构

时间:2013-04-05 06:50:20

标签: entity-framework ef-code-first entity-framework-5

我有3张桌子:

Duty
Task :Duty
ProcessTask : Task

我正在使用TPT层次结构,在创建数据库时一切似乎都很好。但是当我从数据库中读取值时,我没有从Duty表中获取任何值。这是我的问题:

var tasks = _dbContext.Duties.OfType<Task>()
                             .OfType<ProcessTask>()
                             .Where(c => c.ParentID == id);

只返回Task和ProcessTask中的值,尽管SQL查询返回了所有正确的值(我使用SQL Profiler检查过)。

为什么不映射第一个抽象类'字段?非常感谢任何帮助。

我的源代码:

public class Duty
    {
        public int ID { get; set; }        
    }

[Table("Task")]
    public class Task : Duty
    {
        public int ID { get; set; }

        public int? Duration { get; set; }

        public int? NoOfRepeats { get; set; }
    }

[Table("ProcessTask")]
    public class ProcessTask : DigiBob.Model.Governance.Duties.Task
    {
        public int ProcessTaskTypeID { get; set; }
        public virtual ProcessTaskType ProcessTaskType { get; set; } //ProcessTasks

        public int? ParentID { get; set; }
        [ForeignKey("ParentID")]
        public virtual ProcessTask Parent { get; set; }  //Children

        [Required(ErrorMessage = "A short description is required")]
        [MaxLength(150, ErrorMessage = "The maximum length for the short description is 150")]
        public string ShortDescription { get; set; }
    }

public class MyContext : DbContext
{
    public DbSet<Duty> Duties { get; set; }
}

2 个答案:

答案 0 :(得分:0)

您的查询错误... - 否则您的代码应该可以正常运行

  

您有效地做了什么 - 只是返回ProcessTask - s。   (OfType仅选择任务 - 但随后您重新应用   OfType - 并进一步缩小它。

// this returns just ProcessTask-s
IEnumerable<Duty> tasks = db.Duties
    .OfType<Task>()
    .OfType<ProcessTask>()
    .ToList();  

// this returns all Task-s (including processes)
tasks = db.Duties
    .OfType<Task>()
    // .OfType<ProcessTask>()
    .ToList();  

// this returns all Duties (including tasks, processes)
tasks = db.Duties
    .OfType<Duty>()
    .ToList();

答案 1 :(得分:0)

我错误地引用了ID字段。这就是我所拥有的:

public static ProcessTaskView ConvertToProcessTaskView(this ProcessTask processTask)
    {
        ProcessTaskView processTaskView = new ProcessTaskView();
        processTaskView.ShortDescription = processTask.ShortDescription;
        processTaskView.ProcessTaskTypeID = processTask.ProcessTaskTypeID;
        processTaskView.ID = processTask.ID;

        return processTaskView;
    }

这是正确的代码。

public static ProcessTaskView ConvertToProcessTaskView(this Duty processTask)
        {
            ProcessTaskView processTaskView = new ProcessTaskView();
            processTaskView.ShortDescription = (processTask as ProcessTask).ShortDescription;
            processTaskView.ProcessTaskTypeID = (processTask as ProcessTask).ProcessTaskTypeID;
            processTaskView.ID = processTask.ID;

            return processTaskView;
        }

请注意,我现在正在传递Duty对象,并且必须指定访问ProcessTask属性的职责类型。现在ID字段有一个值,而不仅仅是0。

感谢您的帮助