我在这里遇到了一些麻烦。
当我尝试更新我的实体时,抛出此异常:
存储更新,插入或删除语句会影响意外的行数(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 :(得分:0)
首先确保您的FirstOrDefault()
方法完全返回任何对象:
projeto.Cliente = _dao.Cliente.FirstOrDefault(x => x.Id == projeto.Cliente.Id);
您确定projeto.Cliente.Id
设置为适当的ID(或者根本设置了Id
吗?)。
答案 1 :(得分: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
。它会为你节省一些{{1}}个对象。 (寻找外键关联与独立关联)。