2017-01-02 3 views
2

У меня есть универсальный класс RepositoryОбновление Субъект

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

Когда я уточняю деталь и получить его, это свойство навигации (банк) является нулевым

и я не могу использовать товар. Банк, потому что это null.

Наконец-то я понял, где это проблема, которую я создал глобальный архив

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

мой метод загрузки метода getingle, но после этого item = repository.ite .... bank будет null –

+0

. Использование этого редактирования будет загружаться также, когда вы вызываете select. –

Смежные вопросы