Problem updating database data using LINQ to SQL

0

I'm developing a C # ASP.NET application in which I look for certain data from the database, I put it in a form, and when I click 'Save', I want the database to save the changes I made.

I'm using Linq to SQL. The code below, at the end, calls the ClienteBusiness.SalvarAlteracoes(cliente) method, which in turn only calls the ClienteData.SalvarAlteracoes(cliente) method.

protected void Salvar()
    {
        TB_CLIENTE_CLI cliente = new TB_CLIENTE_CLI();

        int idEstado = 0;
        int idCidade = 0;
        if (!Int32.TryParse(ddlEstado.SelectedValue, out idEstado))
        {
            return;
        }
        if (!Int32.TryParse(Request.Form[ddlCidade.UniqueID], out idCidade))
        {
            return;
        }

        cliente.TXT_RAZAOSOCIAL_CLI = txtRazaoSocial.Text;
        cliente.TXT_NOMEFANTASIA_CLI = txtNomeFantasia.Text;
        cliente.TXT_CNPJ_CLI = txtCNPJ.Text;
        cliente.TXT_CEP_CLI = txtCEP.Text;
        /*e os demais campos*/

        //Se a tela for de edição, altera o valor do ID para o cliente correspondente.
        cliente.ID_CLIENTE_CLI = this.IdCliente;

        ClienteBusiness.SalvarAlteracoes(cliente);

        HTMLHelper.jsAlertAndRedirect(this, "Salvo com sucesso!", ResolveUrl("~/Pages/ClientePage.aspx"));
    }

The method that saves the changes follows below:

 public static Int32 SalvarAlteracoes(TB_CLIENTE_CLI cliente)
    {
        using (PlanoTesteDataContext context = DataContext.ObterConexao())
        {

            if (cliente.ID_CLIENTE_CLI == 0)
            {
                context.TB_CLIENTE_CLIs.InsertOnSubmit(cliente);
            }
            else
            {
                context.TB_CLIENTE_CLIs.Attach(cliente, true);
            }

            context.SubmitChanges();
        } return cliente.ID_CLIENTE_CLI;
    }

At line context.TB_CLIENTE_CLIs.Attach(cliente, true); I'm getting the message System.InvalidOperationException: An entity can only be attached as modified without original state if it declares a version member or does not have an update check policy.

I checked the UpdateChecks and they are like Never.

What to do in this situation?

    
asked by anonymous 17.07.2014 / 15:38

1 answer

1

This is not how you use Attach .

First you need to load the object into its context, then modify it, and then you use Attach :

protected void Salvar()
{
    // TB_CLIENTE_CLI cliente = new TB_CLIENTE_CLI();
    var cliente = context.TB_CLIENTE_CLIs.FirstOrDefault(c => c.ID_CLIENTE_CLI == this.IdCliente);
    if (cliente == null) cliente = new new TB_CLIENTE_CLI();
    // Agora sim você pode alterar o objeto cliente, com o contexto 
    // observando corretamente as alterações.

    int idEstado = 0;
    int idCidade = 0;
    if (!Int32.TryParse(ddlEstado.SelectedValue, out idEstado))
    {
        return;
    }
    if (!Int32.TryParse(Request.Form[ddlCidade.UniqueID], out idCidade))
    {
        return;
    }

    cliente.TXT_RAZAOSOCIAL_CLI = txtRazaoSocial.Text;
    cliente.TXT_NOMEFANTASIA_CLI = txtNomeFantasia.Text;
    cliente.TXT_CNPJ_CLI = txtCNPJ.Text;
    cliente.TXT_CEP_CLI = txtCEP.Text;
    /*e os demais campos*/

    //Se a tela for de edição, altera o valor do ID para o cliente correspondente.
    cliente.ID_CLIENTE_CLI = this.IdCliente;

    ClienteBusiness.SalvarAlteracoes(cliente);

    HTMLHelper.jsAlertAndRedirect(this, "Salvo com sucesso!", ResolveUrl("~/Pages/ClientePage.aspx"));
}
    
17.07.2014 / 18:12