2017-09-05 85 views
0

我有一個關於EntityFramework如何工作的問題,因爲它在我正在開發的應用程序中做些奇怪的事情。簡而言之,我將一個子實體(一個報告)添加到一個父實體(一個項目),並將其保存到數據庫,然後當我試圖檢索它時,子實體(報告)不在父項目中實體(項目)。將子實體添加到父實體時不會持久

下面是我在做什麼的更詳細的步驟:

public JsonResult SubmitData(int projectId, string data = null) 

    Project project = _projectService.GetProject(projectId); 
    Report report = CreateReport(data); 
    project.Report.Add(report); 
    _projectService.UpdateProjectForReport(project); 

    // Rest of code omitted... 
} 

public class ProjectService : IProjectService  
{ 
    public void UpdateProjectForReport(Project project) 
    { 
     _context.SaveChanges(); 
    } 

    // Rest of code omitted... 
} 

^上面的代碼獲取用戶填寫後,在一張表上的一些信息,並點擊提交運行。信息被傳遞給SubmitData(...)作爲一個名爲「data」的json字符串。檢索報告所要保存的項目,將json數據轉換爲報告,將報告添加到項目中,並將對項目所做的更改保存到數據庫中。

我確認報告實際上已保存到數據庫並與項目關聯。

然後下一步涉及檢索報告:

public async Task<HttpResponseMessage> GetTop3ReportCard([FromUri] int 

projectId, [FromUri] int reportId = 0) 
{ 
    _project = _projectService.GetProject(projectId); 
    Report report = _project.Report.Where(r => r.ReportId == reportId).FirstOrDefault(); 

    // Rest of code omitted... 
} 

但報告始終爲空。

我已驗證reportId在GetTop3ReportCard(...)的調用中不是0.既不是projectId。

解決此問題的唯一方法是在Visual Studio中重新啓動應用程序。一旦我這樣做,然後嘗試檢索我的報告,它將返回不爲空。

但是,爲什麼像EntityFramework這樣的實體不能通過EntityFramework加載所有屬於它的報告,一旦它們被保存到數據庫中?有什麼關於EntityFramework的工作方式,我不知道在這裏?

+0

是否使用IoC容器來保存上下文的副本?如果是這樣,請檢查您的上下文和ProjectService的範圍。您可能會保留上下文的過時副本。 –

+0

我會怎麼說?如果它已過時,我該如何更新它? – gib65

回答

1

實體框架爲其數據庫支持使用SQL。 SQL不會將記錄或對象存儲在父記錄中,它已經爲此定義了關係和表。將對象存儲在父對象中時,實體框架將只存儲其ID,原始對象屬性將始終爲空。 您需要將您的子對象存儲在另一個表中,並且必須爲其定義一個單獨的類。

現在要獲取您的對象,您有兩個選項,要麼通過使用主表中的id來查詢該對象的表,要麼使用include方法來獲取對象。

var rep = Report.FirstOrDefault(r => r.ReportId == reportId); 

或者

var data = _project.FirstOrDefault(x => x.Id == someId).Include("Report"); 

Read my answer here if you want to learn to define the appropriate relation between the two tables/classes through Entity Framework

+0

感謝Afnan,這工作:var data = _project.FirstOrDefault(x => x.Id == someId).Include(「Report」);爲了增加一些清晰度,問題的一大部分是我將報告保存到一個應用程序的項目中,然後在完全不同的應用程序(Web API)中檢索它。當然,上下文並不瞭解新報告,但您對使用include(「報告」)的建議似乎會對其進行更新。 – gib65