Problem updating database data using LINQ to SQL

Asked

Viewed 604 times

0

I am developing a C# ASP.NET application in which I search for certain database data, play them in a form, and by clicking 'Save', I want the bank to save the changes I made.

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

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;
    }

On the 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’re like Never.

What to do in this situation?

1 answer

1


That’s not how you use the Attach.

First you need to load the object into its context, then modify it, and then you use the 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"));
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.