2017-08-02 46 views
0

我正在使用Timesheet系统。我第一次使用实体框架,并且对关系如何工作感到困惑。如何从Entity Framework数据库获取对象列表?

我有以下类,Week

public class Week 
{ 
    public int WeekId { get; set; } 
    public DateTime FirstDayOfWeek { get; set; } 
    public List<TimeEntry> TimeEntries { get; set; } 
    public Week() 
    { 
     TimeEntries = new List<TimeEntry>(); 
    } 
} 

;每星期包含了一些TimeEntries

public class TimeEntry 
{ 
    public int TimeEntryID { get; set; } 
    public double MonHours { get; set; } 
    public double TueHours { get; set; } 
    public double WedHours { get; set; } 
    public double ThuHours { get; set; } 
    public double FriHours { get; set; } 
} 

英孚已经创建的表,这些是如下的方式:

dbo.Weeks
WeekId(int)
Firstdayofweek可(日期时间)

dbo.TimeEntries
TimeEntryId(INT)
MonHours(浮点)
TueHours(浮点)
WedHours(浮点)
ThuHours(浮点)
FriHours(浮点)
Week_WeekId( int)

在我的表中,我有以下内容:

WeekId --- Firstdayofweek可
1 ------------ 2017年7月31日

TimeEntryId --- --- MonHours ...- TueHours Week_WeekId
1 --- -------------- 1 --------------- 2 ... --------------- 1
2 ----------------- 0 --------------- 1 ...------------ -1

(很抱歉没能严重绘制表!)

问题是,当我尝试和检索使用LINQ从我的控制器的数据,它不拉回来TimeEntries名单。

这是查询我使用:

Week SelectedWeek = (from w in db.Weeks 
    where w.WeekId == 1 
    select w).FirstOrDefault(); 

然而,SelectedWeek.TimeEntries计数为零?

我也尝试了相反的做法(这似乎从一个非EF观点更符合逻辑):

var timeEntries = from te in db.TimeEntries 
    where te.week_weekId == 1 
    select te; 

但是这给了错误:

TimeEntry does not contain a definition for week_weekId...

什么是应该做的正确方法这个?

+0

任何理由的问题提到MVC,为什么它标记为这样?如果不是,我建议你删除这个问题,使问题更清楚。 – Tipx

回答

1
Week SelectedWeek = (from w in db.Weeks 
    where w.WeekId == 1 
    select w).FirstOrDefault(); 

以上SelectedWeek的统计查询结果。TimeEntries是零,因为它没有被加载懒惰或延迟加载。你要么需要添加虚拟关键字为TimeEntries或依靠预先加载

Lazy Loading 
public virtual ICollection<TimeEntry> TimeEntries { get; set; } 

Or 

Eager Loading 
Week SelectedWeek = db.Weeks.Include("TimeEntries").Where(w => w.WeekId == 1).FirstOrDefault(); 

Or 

Explicit Loading 
var selectedWeek = db.Weeks.Find(1); 

// Load the TimeEntries related to a given Week 
context.Entry(selectedWeek).Collection(t => t.TimeEntries).Load(); 

进一步阅读有关使用EF加载相关实体:https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

1

您需要在读取数据时使用Include()子句,以便要求实体框架执行JOIN操作并检索相关记录。

Week SelectedWeek = (from w in db.Weeks.Include(x => x.TimeEntries) 
    where w.WeekId == 1 
    select w).FirstOrDefault(); 
相关问题