2014-02-04 6 views
1

У меня здесь проблемы.Ошибка при обновлении объекта

Когда я пытаюсь обновить свою сущность, это исключение:

магазин обновление, вставка или удаление заявления повлияло неожиданное количество строк (0). Объекты могут быть изменены или удалены, поскольку объекты загружены. Обновить записи ObjectStateManager.

Я искал везде, но безуспешно!

Модель:

public class Projeto 
{ 
    public int Id { get; set; } 
    public int Codigo { get; set; } 
    public string Descricao { get; set; } 
    public virtual Cliente Cliente { get; set; } 
    public DateTime DataInicio { get; set; } 
    public DateTime DataFim { get; set; } 
    public string NumeroContrato { get; set; } 

    public virtual ICollection<Funcionario> Funcionarios { get; set; } 
} 

public class Cliente 
{ 
    public int Id { get; set; } 
    public int Codigo { get; set; } 
    public string Nome { get; set; } 
    public virtual Endereco Endereco { get; set; } 
    public virtual Contato Contato { get; set; } 
    public string CNPJ { get; set; } 
} 

public class Funcionario 
{ 
    public int Id { get; set; } 
    public int Codigo { get; set; } 
    public string Nome { get; set; } 
    public DateTime DataAdmicao { get; set; } 
    public string NomePai { get; set; } 
    public string NomeMae { get; set; } 

    public virtual ICollection<Projeto> Projetos { get; set; } 
} 

Контроллер:

Способ обновления:

public void Salvar(Projeto projeto) 
{ 
    AppContext _dao = new AppContext(); 
    projeto.Cliente = _dao.Cliente.FirstOrDefault(x => x.Id == projeto.Cliente.Id); 
    _dao.Entry(projeto).State = System.Data.Entity.EntityState.Modified; 
    _dao.SaveChanges(); 
} 

Метод "Salvar" не равен этому, я сделал обзор. но это то, что происходит!

ответ

0

Прежде всего убедитесь, что ваш метод FirstOrDefault() возвращает любой объект на всех:

projeto.Cliente = _dao.Cliente.FirstOrDefault(x => x.Id == projeto.Cliente.Id); 

Вы уверены, что ваш projeto.Cliente.Id установлен в соответствующий Id (или есть какие-либо Id множество вообще?).

+0

Да, я уверен, что возвращает действительный «Клиент». – jocieldo

0

Вы должны приложить projeto к контексту первого и затем внести изменения:

// Attach: 
_dao.Entry(projeto).State = System.Data.Entity.EntityState.Attached; 
// Change: 
projeto.Cliente = _dao.Cliente.FirstOrDefault(x => x.Id == projeto.Cliente.Id); 

Кроме того, убедитесь, что projeto.Cliente загружен, прежде чем изменить его, иначе изменение трекер не заметит изменений.

Обратите внимание, что вы также можете установить значение примитивного внешнего ключа ClienteId, если вы сделаете эту часть модели. Это сэкономит вам несколько нагрузок Cliente объектов. (Ищите ассоциации внешних ключей против независимых ассоциаций).

+0

Не работает. Я попробовал это. «Проект» - всего лишь модель. а также попытался вставить внешний ключ, а не работать с той же ошибкой. – jocieldo

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