2013-09-19 4 views
8

Я новичок в Entity Framework. Я пытаюсь обновить запись и сохранить изменения в базе данных.Запись обновления Entity Framework не работает

public void SaveEdit(Gate gate) 
     { 
      try 
      { 
       using (dc = new GateEntities()) 
       { 
        var query = (from tbsite in dc.tblSites 
           where tbsite.ID == gate.ID 
           select tbsite).FirstOrDefault(); 

        query.CalledInAt = gate.CalledInAt; 
        query.CallerRequest = gate.CallerRequest; 
        query.ContactPersonOnSite = gate.ContactPersonOnSite; 
        query.Email = gate.Email; 
        query.EmailSitePerson = gate.EmailSitePerson; 

        dc.SaveChanges(); 
       } 
      } 
      catch (Exception ex) 
      { 

       throw ex; 
      } 



     } 

Он не принимает никаких исключений или сообщений об ошибках, но не сохраняет изменения в базе данных. почему он не обновляет запись?

+0

Попробуйте установить точку останова, чтобы посмотреть, не переносит ли ваша переменная 'query' какие-либо значения? –

+7

Избегайте 'throw ex'', поскольку [свойство для повторного броска] (http://msdn.microsoft.com/en-us/library/ms182363.aspx) исключение - 'throw;'. Если исключение повторно выбрано, указав исключение в инструкции throw, трассировка стека будет перезапущена в текущем методе и список вызовов методов между исходным методом, который вызвал исключение, и текущий метод потерян. Чтобы сохранить исходную информацию трассировки стека с исключением, используйте инструкцию throw без указания исключения. –

+2

Я бы не назвал вашу переменную 'query', поскольку она, очевидно, не является запросом (бит внутри скобок - это запрос, но переменной присваивается результат' FirstOrDefault() '). Это сайт. Также почему вы используете 'FirstOrDefault()', если вы не проверяете значение по умолчанию (null)? Почему бы просто не использовать 'First()', так как в итоге вы получите исключение, либо с учетом текущего кода. –

ответ

4

Вы должны использовать entityframework, чтобы выбрать объект, с тем, что объект будет результат трек-состоянии, поэтому попробуйте этот

  using (var dc = new GateEntities()) 
      { 
       var gate = dc.tblSites.Where(g => g.ID == date.ID).FirstOrDefault(); 

       gate.CalledInAt = gate.CalledInAt; 
       gate.CallerRequest = gate.CallerRequest; 
       gate.ContactPersonOnSite = gate.ContactPersonOnSite; 
       gate.Email = gate.Email; 
       gate.EmailSitePerson = gate.EmailSitePerson; 

       dc.SaveChanges(); 
      } 
10

После изменения query объекта Вы должны изменить его состояние на Modified перед вызовом context.SaveChanges(). Ваш объект контекста должен знать об объекте, который вы изменяете. Предполагая, что dc это Ваш объект контекста:

query.CalledInAt = gate.CalledInAt; 
//change other properties .. 
dc.Entry(query).State = EntityState.Modified; 
dc.SaveChanges(); 

Это должно работать для вас.

+1

Я считаю, что теперь это предпочтительное использование (с записью) в EF6. – Encryption

+0

Я не понимаю ..... Так что отслеживание не включено по умолчанию? – Darkonekt

+0

Спасибо за вашу большую помощь;) –

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