Fórum Como modificar a chave primária de um registro utilizando LINQ 2 Entities? #12460
02/12/2009
0
Gostaria de atualizar a chave primária de um registro utilizando Linq 2 Entities.
Quando eu faço update via SQL Server Manager, atualizo corretamente o registro, mas quando tento via linq ele diz que não pode atualizar pois a propriedade código faz parte da chave e não pode ser modificada.
Vou passar o script da tabela, e depois meu método de update pra análise:
USE [CONSTRUSYS]
GO
/****** Object: Table [Fiscal].[OrigemIcms] Script Date: 12/02/2009 17:46:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [Fiscal].[OrigemIcms](
[codigo] [int] NOT NULL,
[descricao] [varchar](50) NOT NULL,
CONSTRAINT [PK_origemIcms] PRIMARY KEY CLUSTERED
(
[codigo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
Método de update:
//Altera um registro existente na tabela OrigemICMS
public void updateOrigemICMS()
{
try
{
Entities db = new Entities();
var upOrigemICMS = (from p in db.OrigemIcms
where p.codigo == staticCodigo
select p).First();
//Implantar mudança de PK
upOrigemICMS.codigo = this.codigo;
upOrigemICMS.descricao = this.descricao;
db.SaveChanges();
MessageBox.Show(ClassMessages.SucessUpdate);
}
catch (Exception ex)
{
MessageBox.Show(ClassMessages.ErrorUpdate
+ ex.Message,
"Alterar Origem ICMS");
}
}
Daniel Vieira
Curtir tópico
+ 0Posts
03/12/2009
Luiz Maia
Gostei + 0
03/12/2009
Daniel Vieira
Por exemplo, a CST, posso ter os valores:
00
10
20
30
40
41
50
51
70
99
etc...
Quem define é o governo, eu vou gerar as telas para o dpto fiscal fazer o cadastro, e se o governo cria um novo, ou altera um exitente, eles possam alterar.
Gostei + 0
03/12/2009
Luiz Maia
Gostei + 0
03/12/2009
Daniel Vieira
A primeira linha é um texto default feito por mim, a segunda é a exception gerada pelo framework
Gostei + 0
03/12/2009
Luiz Maia
Gostei + 0
03/12/2009
Daniel Vieira
Esse é pra chave primária PK. Eu tentei e não funcionou com o mesmo método da chave estrangeira.
Gostei + 0
03/12/2009
Daniel Vieira
Esse é pra chave primária PK. Eu tentei e não funcionou com o mesmo método da chave estrangeira.
Gostei + 0
04/12/2009
Luiz Maia
Gostei + 0
04/12/2009
Daniel Vieira
Meu Model não reconhece o método
db.SubmitChanges();
Vou testar com o que eu estou acostumado a usar e funciona, o
db.SaveChanges();
vamos ver se roda!
Gostei + 0
04/12/2009
Daniel Vieira
A propria exception disse que não existe o metodo Single no Linq to Entities, e disse pra usar o metodo first(o que eu utilizo normalmente)
Ficou definido da seguinte maneira:
try
{
Entities db = new Entities();
var upOrigemICMS = db.OrigemIcms.First(pa => pa.codigo == staticCodigo);
upOrigemICMS.codigo = this.codigo;
upOrigemICMS.descricao = this.descricao;
db.SaveChanges();
}
catch (Exception ex)
{
MessageBox.Show(ClassMessages.ErrorUpdate
+ ex.Message,
"Alterar Origem ICMS");
}
Acabou gerando o mesmo erro, da primeira vez, mas analisando o codigo, ficou identico ao meu metodo de alteracao, exceto a query, agora esta usando expressao lambda...
Eu estou usando L2E
Sera que voce nao utilizou outra metodologia de acesso a dados?
Gostei + 0
04/12/2009
Luiz Maia
Gostei + 0
04/12/2009
Daniel Vieira
Gostei + 0
06/12/2009
Luiz Maia
Gostei + 0
07/12/2009
Daniel Vieira
Hehe, desculpe a revolta, mas é que vou ter que modificar a estrutura do meu projeto agora...
Vou ver com o Analista se posso criar uma pk identity, e deixar o codigo como um campo comum, mas o problema é que eles precisam ser fk de outras tabelas, não vai dar certo...
Eu ainda não utilizei sp no L2E, voce poderia me dar um exemplo basico, pra finalizarmos o chamado?
Gostei + 0
07/12/2009
Luiz Maia
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[CustOrdersOrders] @CustomerID nchar(5)
AS
SELECT *
FROM Orders
WHERE CustomerID = @CustomerID
ORDER BY OrderID E no codigo: var db =new NorthwindEntities();
var v=db.CustomerOrders("ALFKI"); So uma dica, dentro da SP vc pode criar uma Tabela temporaria, que sera populada com os dados que precisa, sem se importar com PK, depois vc importa os dados da #tabela para a tabela real. Abraços Att Luiz Maia
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)