2011-05-19 53 views
7

我有兩個數據庫表(NEWS和NEWS_IMAGES),我已經爲它們在模型中建立了一對多關聯而生成了一個實體模型。ASP.NET Entity Framework 4導航實體沒有反映對數據庫所做的更改

但是,當我使用Navigation屬性(NEWS_IMAGES)查詢模型時,它不會返回任何最近的數據庫插入,但是如果我查詢導航實體本身,那麼我將獲得所有最新更改。

第一種方法使用導航屬性:

IEnumerable<NEWS_IMAGES> imgs = dal.NEWS_IMAGES.Where(i => i.News_ID == NewsID) 

這是插入一條記錄到NEWS_IMAGES實體代碼:使用實際的實體(返回所有最近更改)

IEnumerable<NEWS_IMAGES> imgs = dal.NEWS.Where(n => n.NEWS_ID == NewsID).FirstOrDefault().NEWS_IMAGES; 

第二種方法:

NEWS_IMAGES img = new NEWS_IMAGES 
      { 
       News_ID = newsID, 
       News_Image_Filename_Small = file_Sm, 
       News_Image_Filename_Medium = file_Med, 
       News_Image_Filename_Large = file_Lrge, 
       News_Image_Order = imgCnt + 1 
      }; 
      dal.NEWS_IMAGES.AddObject(img); 
      dal.SaveChanges(); 
+1

是'imgs'在第一個例子'null'或者它含有的元素,但不是所有的都在數據庫?在第一種情況下,如果您不使用延遲加載,則需要包含導航屬性:'dal.NEWS.Include(「NEWS_IMAGES」)。其中...'。在第二種情況下,我不知道。那麼很可能需要更多細節來追蹤問題。 – Slauma 2011-05-19 12:45:52

+0

在任何一種情況下'imgs'都不爲空。問題在於它不包含剛添加到數據庫中的任何新記錄(當使用第一行代碼時)。已經嘗試過'include'選項,但仍然是一樣的。延遲加載在主edmx模型上啓用。 – mgTS 2011-05-19 13:03:15

+0

如果您可以顯示「NEWS」和「NEWS_IMAGE」類以及代碼如何在上下文中插入新實體,可能會有所幫助。 – Slauma 2011-05-19 13:51:22

回答

0

你應該嘗試使用以下應該做的伎倆:

IEnumerable<NEWS_IMAGES> imgs = 
    dal.NEWS.Where(n => n.NEWS_ID == NewsID).SelectMany(i => i.NEWS_IMAGES) 
3

EF的默認行爲是僅加載由應用程序直接訪問的實體(例如,新聞)。如果EF加載了所有相關的實體(例如News_Images),那麼您將最終加載比實際需要更多的實體。 您可以使用熱切加載加載相關實體,使用包含()方法。 在你的情況,你就會有這樣的事情:

var imgs= dal.NEWS.Include("NEWS_IMAGES").Where(n => n.NEWS_ID == NewsID).FirstOrDefault(); 
相關問題