2017-08-02 51 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(); 
相關問題