Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过Linq将数据库更新为SQL不工作_C#_Asp.net_Linq To Sql - Fatal编程技术网

C# 通过Linq将数据库更新为SQL不工作

C# 通过Linq将数据库更新为SQL不工作,c#,asp.net,linq-to-sql,C#,Asp.net,Linq To Sql,我正在开发一个C#ASP.NET应用程序,在这个应用程序中,我从数据库中检索一些数据,输入一个表单,当我单击“保存”时,我希望它将我的更改保存到数据库中 我正在使用LINQtoSQL。最后,下面的代码调用方法clientBusiness.SalvarAlteracoes(client),顺便说一下,它只调用clientData.SalvarAlteracoes(client)方法 protected void Salvar() { TB_CLIENTE_CLI cliente = new

我正在开发一个C#ASP.NET应用程序,在这个应用程序中,我从数据库中检索一些数据,输入一个表单,当我单击“保存”时,我希望它将我的更改保存到数据库中

我正在使用LINQtoSQL。最后,下面的代码调用方法
clientBusiness.SalvarAlteracoes(client)
,顺便说一下,它只调用
clientData.SalvarAlteracoes(client)
方法

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"));
}
保存更改的方法如下所述:

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;
}
在线
context.TB\u CLIENTE\u CLIs.Attach(CLIENTE,true)
我收到一个
System.InvalidOperationException:如果实体声明了版本成员或没有更新检查策略,则只能将其附加为已修改而没有原始状态

我已经检查了UpdateChecks,它们被设置为从不

我能做什么?感谢并为糟糕的英语感到抱歉。

这应该可以:

else
    {
     context.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, cliente);
     context.TB_CLIENTE_CLIs.Attach(cliente);
   }

此刷新重载将保留用户所做的更改,它将修改后的实体与数据库中的原始值进行比较,检测差异并将实体标记为已修改,并且对SubmitChanges的调用将更新应用于数据库。

如果将Linq2SQL与断开连接的实体一起使用,很可能会遇到麻烦。EF是处理此问题的更合适的解决方案

但是,请确保已将
UpdateCheck
上实体的所有属性设置为
NEVER
。我自己已经测试过了,效果很好。如果这起作用,它将在每一列上运行UPDATE语句,而不管它是否已更新。如果在表上使用触发器,可能会导致问题。最好使用
时间戳
来跟踪实体,这样可以在多个用户之间引发并发问题

如果尝试从
ObjectTrackingEnabled
未设置为
False
的上下文中附加
实体,则会引发以下异常:

An unhandled exception of type 'System.NotSupportedException' occurred in System.Data.Linq.dll

Additional information: An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext.  This is not supported.
例如,请使用以下方法检索和重新附着实体:

    public TB_CLIENTE_CLI Get(int id)
    {
        using (PlanoTesteDataContext ctx = new PlanoTesteDataContext())
        {
            ctx.ObjectTrackingEnabled = false;
            return ctx.TB_CLIENTE_CLI.SingleOrDefault(n => n.ID == id);
        }
    }

    public void Save(TB_CLIENTE_CLI cliente)
    {
        using (PlanoTesteDataContext ctx = new PlanoTesteDataContext())
        {
            ctx.DeferredLoadingEnabled = false;
            ctx.TB_CLIENTE_CLI.Attach(cliente, true);
            ctx.SubmitChanges();
        }
    }

您还需要在
Save
方法中将
DeferredLoadingEnabled
加载设置为
False
,以便在第一次初始修改保存后,可以在后续时间保存对实体所做的更改。

现在我遇到以下异常:
DuplicateKeyException:无法添加键为已在使用。
EDIT:上述异常是否与Datacontext的不同实例相关?(一个正在检索对象,另一个正在尝试保存它?@VictorAlencarSantos请重试