通过Linq到SQL更新数据库不工作
本文关键字:数据库 工作 更新 SQL Linq 通过 | 更新日期: 2023-09-27 18:13:17
我正在开发一个c# ASP。. NET应用程序,在其中我从数据库中检索一些数据,抛出的形式,当我点击保存,我希望它保存我在数据库中的更改。
我正在使用Linq to SQL。下面的代码,在最后,调用方法ClienteBusiness.SalvarAlteracoes(cliente)
,顺便说一下,它只调用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"));
}
保存更改的方法如下所述:
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_CLIENTE_CLIs.Attach(cliente, true);
线上,我正在接收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
。
我已经检查了UpdateChecks,它们被设置为Never。
我能做什么?
应该可以:
else
{
context.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, cliente);
context.TB_CLIENTE_CLIs.Attach(cliente);
}
这个刷新过载将保留用户所做的更改,它将修改后的实体与数据库中的原始值进行比较,检测差异并将实体标记为已修改,然后调用SubmitChanges将更新应用到数据库。
使用Linq2SQL处理断开连接的实体时很可能会遇到麻烦。EF是一个更合适的解决方案。
但是,请确保您已将UpdateCheck
上实体的所有属性设置为NEVER
。我自己测试过了,效果不错。如果这确实有效,它将对每个列运行UPDATE语句,而不管它是否已被更新。如果在表上使用触发器,可能会导致问题。使用Timestamp
来跟踪实体可能是一个更好的主意,这样可以提出多个用户之间的并发性问题。
如果您尝试从ObjectTrackingEnabled
未设置为False
的上下文中Attach
实体,那么您将会抛出以下异常:
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
,以便您可以在修改时首次初始保存之后保存对实体的后续更改。