2017-01-02 152 views
2

我有一個通用的倉儲類更新實體

public class Repository<T> 
    where T : class 
{ 
    AccountingEntities ctx = new AccountingEntities(); 

    public T Add(T entity) 
    { 
     ctx.Set<T>().Add(entity); 
     SaveChanges(); 
     return entity; 
    } 

    public T Update(T entity, int id) 
    { 
     T existing = ctx.Set<T>().Find(id); 
     if (existing != null) 
     { 
      ctx.Entry(existing).CurrentValues.SetValues(entity); 
      SaveChanges(); 
     } 
     return existing; 
    } 

    public T GetSingle(Expression<Func<T, bool>> filter) 
    { 
     var query = ctx.Set<T>().AsNoTracking().Where(filter).FirstOrDefault(); 
     return query; 
    } 

    private void SaveChanges() 
    { 
     ctx.SaveChanges(); 
    } 
} 

和我有兩個表項和銀行。每家銀行可以有多個項目。

我有兩個按鈕添加和編輯和一個全局存儲庫在我的形式。

當我打開並填寫數據,然後單擊添加這樣的記錄將保存每

事情是確定的,但在這個時候,當我點擊編輯會出現錯誤讓我們來看看

我的編輯按鈕的代碼:

private void _btnEdit_Click(object sender, EventArgs e) 
    { 

     var item = repository.GetSingle(i => i.Id == id); 

      // here i update property of item 

      item = repository.Update(item, item.Id); 
      // here i get updated item 
    } 

我的問題是,在這行代碼

var item = repository.GetSingle(i => i.Id == id); 

當我得到的項目,它的導航性能(這裏的銀行實體)充滿

,但在這行代碼

item = repository.Update(item, item.Id); 

當我更新的項目,並得到它,它的導航性能(銀行)爲空

我無法使用物品。銀行,因爲它是空的。

我終於明白哪裏是我的添加和編輯方法創建的全局庫

Repository<Item> repository = new Repository<Item>(); 

和使用存儲庫的問題。當我創建

獨立的存儲設備中的每個添加和編輯的方法,它工作正常

我想知道爲什麼出現這種情況?

+0

= repository.Update(項的itemId) ;'?你在這行中爲對象'item'分配一些東西?我相信你只需要執行'repository.Update(item,itemId);' – Vahx

回答

1

您需要使用熱切加載使用Include(),但首先編輯GetSingle()。 EF默認啓用延遲加載。因此,你需要做的是這樣的:

public virtual T GetSingle(Func<T, bool> where, 
     params Expression<Func<T, object>>[] navigationProperties) 
    { 
     T item = null; 
     using (var context = new MainContext()) 
     { 
      IQueryable<T> dbQuery = context.Set<T>(); 

      //Apply eager loading 
      foreach (Expression<Func<T, object>> navigationProperty in navigationProperties) 
       dbQuery = dbQuery.Include<T, object>(navigationProperty); 

      item = dbQuery 
       .AsNoTracking() //Don't track any changes for the selected item 
       .FirstOrDefault(where); //Apply where clause 
     } 
     return item; 
    } 

現在你可以加載Bank實體

var item = repository.GetSingle(i => i.Id == id).Include(b=>b.Bank); 

在這裏,你爲什麼要使用`項目找到more

+0

我的單行方法加載銀行實體,但在此項目之後= repository.ite ....銀行將爲空 –

+0

使用此編輯也將加載時你打電話給select。 –