2017-01-02 7 views
2

aktualisieren Ich habe eine generische Repository Klasseeine Entität

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(); 
    } 
} 

und ich habe zwei Tabellenelement und eine Bank. Und jede Bank kann mehrere Artikel haben.

Ich habe zwei Schaltflächen hinzufügen und bearbeiten und ein globales Repository in meiner Form.

Wenn ich Formular öffnen und Daten füllen und fügen klicken so wird Datensatz speichern und jede

Sache ist in Ordnung, aber zu dieser Zeit, als ich bearbeiten klicken, wird es sein Fehler lassen sehen die

meine bearbeiten Button-Code:

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 
    } 

mein Problem ist, dass bei dieser Codezeile

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

, wenn ich Einzelteil erhalten, ist es Navigationseigenschaft (hier Bank juristische Person)

gefüllt ist, aber bei dieser Codezeile

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

Wenn ich Artikel aktualisieren und bekommen es, es Navigationseigenschaft ist (Bank) ist null

und ich kann Artikel nicht verwenden. Bank, weil es null ist.

Schließlich begriff ich, wo ist Problem, das ich globale Repository Methode

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

und Verwendung Repository in hinzufügen und bearbeiten, erstellt. Und wenn ich erstellt

separates Repository in jedem hinzuzufügen und zu bearbeiten Methode funktioniert es gut

Ich möchte wissen, warum dies geschehen?

+0

finden Warum Sie verwenden 'item = repository.Update (item, itemId) ; '? Sie ordnen dem Objekt "item" in dieser Zeile etwas zu? Ich glaube, Sie müssen nur 'repository.Update (item, itemId);' – Vahx

Antwort

1

Sie müssen Eager laden mit Include() verwenden, aber bearbeiten Sie zuerst GetSingle(). EF hat standardmäßig Lazy Loading aktiviert. So was Sie tun müssen es wie folgt aus:

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; 
    } 

Jetzt können Sie laden Bank Einheit

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

Sie hier more

+0

meine getsingle Methode Bank Entität laden, aber nach diesem Artikel = repository.ite .... Bank wird Null sein –

+0

Mit dieser Änderung wird auch geladen werden, wenn Du rufst auswählen an. –

Verwandte Themen