2013-06-01 30 views
1

在這個例子中:我不明白EF5 dbContext.Entry(entity).Reload()方法應該如何工作?

using System; 
using System.Collections.Generic; 
using dbModel; 
using System.Linq; 
using System.Data.Entity.Infrastructure; 


namespace WinApp 
{ 
    public partial class Form1 : Form 
    { 
     private dbEntities dbc; 
     public IQueryable<ARTIKLI> art; 
     public IQueryable<ART_GRUPE> grp; 

     public Form1() 
     { 
      InitializeComponent(); 
      dbc = new dbEntities();    
     } 


     private void GetData() 
     { 
      art = from a in dbc.ARTIKLIs 
         select a; 

      grp = from g in dbc.ART_GRUPE 
         select g; 

      artikliBindingSource.DataSource = art.ToList(); 
      artGrupeBindingSource.DataSource = grp.ToList(); 
     } 


     private void Form1_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e) 
     { 
      dbc.SaveChanges(); 
     } 


     private void loadData_Click(object sender, EventArgs e) 
     { 
      this.GetData(); 
     } 


     private void refresh_Click(object sender, EventArgs e) 
     { 

      dbc.Entry(grp).Reload(); 
      artGrupeBindingSource.ResetBindings(false); 
     } 

    } 
} 

一切建立確定。但是,當我運行,並單擊刷新按鈕,我得到錯誤:

的實體類型DbQuery`1是不是該機型爲當前上下文

我只是想刷新從存儲數據的一部分grp使用DbContext的實體實例。我知道我可以轉換成DbContextObjectContext然後用Refresh的方法,但 它應該可以做同樣的DbContext.Entry(entity).Reload();

有人可以解釋在上面的代碼我的錯誤?

+1

'grp'不是一個實體,它是一個查詢 –

+0

我知道...如何刷新使用dbContext查詢? – EmirZ

+0

我會再次調用'GetData' –

回答

6

如果dbEntitiesDbContext,那麼您正在談論的是,有效地執行dbc.Entry<ART_GRUPE>().Reload();,放棄所有更改並重新加載實體,而不是重新加載您的查詢。但是,這不存在。您可以使用dbc.Entry<ART_GRUPE>(myEntity).Reload()"MSDN - DbEntityEntry<TEntity>.Reload Method")丟棄對單個實體所做的任何更改。

DbContext並不意味着長期居住,你打算用它來查詢,然後擺脫它。如果要將其投射到對象上下文中,可以嘗試:

var ctx = ((IObjectContextAdapter)db).ObjectContext; 
ctx.Refresh(); 

這可能不是您所需要的。它也不會從你的上下文中刪除從數據庫中刪除的實體,它並不總是刷新關係。你可能會更好擺脫環境並重新裝入:

private void GetData() 
{ 
    // you could wrap this in a using statement, though that isn't necessary 
    using (var dbc = new dbEntities()) 
    { 
     art = from a in dbc.ARTIKLIs 
      select a; 

     grp = from g in dbc.ART_GRUPE 
      select g; 

     artikliBindingSource.DataSource = art.ToList(); 
     artGrupeBindingSource.DataSource = grp.ToList(); 
    } 
} 
private void refresh_Click(object sender, EventArgs e) 
{ 
    GetData(); 
    // not sure you need this next line now, but you should test 
    artGrupeBindingSource.ResetBindings(false); 
} 

的問題,這可能會導致你的是,你正在改變ARTIKLIs,並試圖跟蹤他們。對於您可以使用類似下面的保存更改,每次不重裝你的ARTIKLIs

private void GetData(bool loadArtikli = true) 
{ 
    // you could wrap this in a using statement, though that isn't necessary 
    using (var dbc = new dbEntities()) 
    { 
     if (loadArtikli) 
     { 
      art = from a in dbc.ARTIKLIs 
       select a; 
     } 

     grp = from g in dbc.ART_GRUPE 
      select g; 

     artikliBindingSource.DataSource = art.ToList(); 
     artGrupeBindingSource.DataSource = grp.ToList(); 
    } 
} 
private void refresh_Click(object sender, EventArgs e) 
{ 
    GetData(false); 
} 

public static void UpdateARTIKLI(ARTIKLI item) 
{ 
    using (var dbc = new dbEntities()) 
    { 
    if (item.Id > 0) 
    { // update existing ones 
     var dbitem = context.ARTIKLI 
     .Find(item.Id); 

     context.Entry(dbItem) 
     .CurrentValues 
     .SetValues(item); 
    } 
    else 
    { // deal with new ones 
     context.ARTIKLI.Add(item); 
    } 

    context.SaveChanges(); 
    } 
} 
+0

應該是什麼情況? –

+0

@WiktorZychla。更正了,謝謝。「實例」是我缺乏咖啡和睡眠的一種表達。 –

+0

輸入法需要實例參數 –

相關問題