更新实体出错

时间:2014-02-04 18:12:20

标签: c# .net entity-framework entity-framework-6

我在这里遇到了一些麻烦。

当我尝试更新我的实体时,抛出此异常:

  

存储更新,插入或删除语句会影响意外的行数(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”不等于此,我做了总结。但这就是发生的事情!

2 个答案:

答案 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}}个对象。 (寻找外键关联与独立关联)。