1

我有 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; }
}
4

2 回答 2

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();
于 2013-04-06T20:44:08.023 回答
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 属性的 Duty 类型。现在 ID 字段有一个值,而不仅仅是 0。

谢谢您的帮助

于 2013-04-07T09:13:53.707 回答