我有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; }
}
答案 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。
感谢您的帮助