Mvc e Entity Framework - SCOPE_IDENTITY ()

375 views
Skip to first unread message

Luis Eduardo

unread,
Oct 5, 2011, 2:04:39 PM10/5/11
to DotNet Brasil
Como faço para retornar a id da última chave primária inserida na
tabela como normalmente se faz no sql com SCOPE_IDENTITY ().

Já que no framework apenas colocamos


db.TBL_MOB_PEDIDOS.AddObject(tbl_mob_pedidos);
db.SaveChanges();


Vlw.

Rodrigo Braga

unread,
Oct 5, 2011, 2:07:03 PM10/5/11
to dotn...@googlegroups.com
talvez algo como:

db.TBL_MOB_PEDIDOS.Last().SeuIdAqui

2011/10/5 Luis Eduardo <luisedua...@gmail.com>:

> --
> ==============================
> Comunidade de desenvolvedores Dot Net no Brasil
>
> WebSite: www.dotnetbr.com
>
> E-mail do Grupo: dotn...@googlegroups.com
> ==============================
>

--
Att.,
Rodrigo Braga

Fabio Rodrigues e Souza

unread,
Oct 5, 2011, 2:07:29 PM10/5/11
to dotn...@googlegroups.com
Faz um tempo que não uso o Entity, mas se não me engano, o método já retorna o Id, não?

Paulo César de França Viana pcfviana

unread,
Oct 5, 2011, 2:08:01 PM10/5/11
to dotn...@googlegroups.com
Depois que você  faz SaveChanges pode tentar acessar a propriedade no seu objeto tbl_mob_pedidos que já vai estar com o identificador.

2011/10/5 Luis Eduardo <luisedua...@gmail.com>
--
==============================
Comunidade de desenvolvedores Dot Net no Brasil

WebSite: www.dotnetbr.com

E-mail do Grupo: dotn...@googlegroups.com
==============================



--
Paulo César Viana
MCP - Microsoft Certified Professional
MCTS - Microsoft Certified Technology  Specialist
(061) 8192 9092
@pcfviana

Renato Cantarino

unread,
Oct 5, 2011, 2:08:26 PM10/5/11
to dotn...@googlegroups.com
Max()

Fabio Rodrigues e Souza

unread,
Oct 5, 2011, 2:10:55 PM10/5/11
to dotn...@googlegroups.com
Vou na idéia do @Paulo, se não me engano é isso mesmo!

Bruno Gross

unread,
Oct 5, 2011, 2:13:12 PM10/5/11
to dotn...@googlegroups.com
Usar Max é a maior gambiarra do mundo!

O save preenche a entidade com o ID, não?



2011/10/5 Fabio Rodrigues e Souza <fabio.rod...@gmail.com>



--
Visite:
DotNet Br
Compras no Exterior

att.
Bruno Gross
(21) 83422729

Renato Cantarino

unread,
Oct 5, 2011, 2:15:57 PM10/5/11
to dotn...@googlegroups.com
Nao vejo como gato.
Nao está lá? por que nao usar?

Fabio Rodrigues e Souza

unread,
Oct 5, 2011, 2:19:49 PM10/5/11
to dotn...@googlegroups.com
Eu na verdade nunca usei Max, mas se utilizasse, teoricamente seria para pegar o valor máximo para alguma coisa qualquer.
Menos para supor  o Id, tudo bem que logicamente seria o ID, mas mesmo assim.

Renato Cantarino

unread,
Oct 5, 2011, 2:21:51 PM10/5/11
to dotn...@googlegroups.com
Pegar outra coisa, mas nao pegar o ID.....
Nao ficou clara sua explicação!

Fabio Rodrigues e Souza

unread,
Oct 5, 2011, 2:23:50 PM10/5/11
to dotn...@googlegroups.com
Por exemplo, usar o Id máximo para alguma comparação.
não para dizer que o meu objeto tem aquele ID.

Luis Eduardo

unread,
Oct 5, 2011, 2:23:51 PM10/5/11
to dotn...@googlegroups.com
É verdade galera depois do SaveChanges ele já incrementa no Objeto...

Vlw !

Também acho usar o Max "gambiarra" pois sendo uma aplicação usada por varios usuarios ...

Em 5 de outubro de 2011 15:21, Renato Cantarino <renato.c...@gmail.com> escreveu:

Renato Cantarino

unread,
Oct 5, 2011, 2:23:57 PM10/5/11
to dotn...@googlegroups.com
E se fosse para recuperar o ultimo ID inserido em outra pagina como ficaria?
Montaria um lista com tudo e depois mandava um Last()?


Em 5 de outubro de 2011 15:21, Renato Cantarino <renato.c...@gmail.com> escreveu:

emerson...@gmail.com

unread,
Oct 5, 2011, 2:25:09 PM10/5/11
to dotn...@googlegroups.com

Quando sua entidade passa pelo SaveChanges o próprio framework via reflection já adiciona o ID na entidade salva no context.

Rodrigo Silva de Andrade

unread,
Oct 5, 2011, 2:26:32 PM10/5/11
to dotn...@googlegroups.com
Quando vc salva, se o campo id for identity, ele ja preenche o id do objeto salvo com o id referente a ele no banco, nao precisa usar max nem nada parecido.

Luis Eduardo

unread,
Oct 5, 2011, 2:27:00 PM10/5/11
to dotn...@googlegroups.com
Realmente Emerson percebi isso agora,

Comecei a usar o entity agora e estou um pouco perdido, mas já estou me achando hehe.

Bruno Gross

unread,
Oct 5, 2011, 2:28:17 PM10/5/11
to dotn...@googlegroups.com
Renato

2 transações incluindo ao mesmo tempo no banco.

Como garantir que o max retorna o ID certo?

Onde está seu deus agora?

No PHP com MySql era uma merda tipo isso que precisávamos fazer. E dava uma merda ABSURDA!

Quanto a "recarregar", deixe que o cache resolva se precisa recarregar ou não.

Por allah, isso é o cúmulo da gambiarra. É Feio que nem bater em mãe na noite de natal. Não usem!

2011/10/5 Renato Cantarino <renato.c...@gmail.com>

Renato Cantarino

unread,
Oct 5, 2011, 2:42:00 PM10/5/11
to dotn...@googlegroups.com
Nao. Se esta la, tem q usar.

Voce esta falando isso quando esta no mesmo contexto.
e se fosse em outra pagina?

Bruno Gross

unread,
Oct 5, 2011, 2:44:12 PM10/5/11
to dotn...@googlegroups.com
Cara, ele ta la pra vc pegar o max de alguma coisa

tipo quem tirou a maior nota em um universo x. 

Nunca pra recuperar um ID

Tem tanta coisa que ta lá e se vc usar vc é maluco, não pense assim!

2011/10/5 Renato Cantarino <renato.c...@gmail.com>

Renato Cantarino

unread,
Oct 5, 2011, 2:45:57 PM10/5/11
to dotn...@googlegroups.com
Tem alguma especificação falando que nao pode usar em ID, ou voce esta apenas... chutando?

Renato Cantarino

unread,
Oct 5, 2011, 2:52:41 PM10/5/11
to dotn...@googlegroups.com

Bruno Gross

unread,
Oct 5, 2011, 2:55:54 PM10/5/11
to dotn...@googlegroups.com
Vc trabalha com ORMs?

2011/10/5 Renato Cantarino <renato.c...@gmail.com>

Renato Cantarino

unread,
Oct 5, 2011, 3:01:24 PM10/5/11
to dotn...@googlegroups.com
Sim EF.

Eu sei que depois que vc da o SubmitChages(), vc recupera o id que foi salvo.

ex...db.SubmitChanges().;
       int id = db.Tabela.ID;

Agora, em outro contexto?
pq nao usar o Max? ou vou ter q montar uma lista e da lista dar um Last()?

Bruno Gross

unread,
Oct 5, 2011, 3:10:22 PM10/5/11
to dotn...@googlegroups.com
Cara, veja bem

Ok, vc pode usar o Max pra saber o maior id do seu banco. Você pode dar um select order desc com limit 1 trazendo o ID. É a mesma coisa, por exemplo.

Agora, NÃO há como garantir que o max ou o select vai te retornar com 100% de certeza o último ID inserido no banco! A não ser que sua transação vá dar lock na tabela, rodar, devolver o max e aí sim liberar pra concerrência, o que não é o melhor dos cenários (e inútil a meu ver só pra isso).

Por exemplo duas transações

T1 e T2

No momento 0 e 0,00001
T1 insere no banco com o ID 30
T2 insere no banco com o ID 31
No momento 1
T1 chama o max que retorna 31

Foi-se sua integridade...

Concorda agora?

2011/10/5 Renato Cantarino <renato.c...@gmail.com>

Fabio Rodrigues e Souza

unread,
Oct 5, 2011, 3:10:44 PM10/5/11
to dotn...@googlegroups.com
Se eu estou em outro contexto e quero pegar o ultimo, faço um Orderby .First();
Tou errado então? rs

Bruno Gross

unread,
Oct 5, 2011, 3:13:40 PM10/5/11
to dotn...@googlegroups.com
Agora q entendi o ponto do renato.

Ta, em outro contexto claro que vc tem que usar o max.

Agora no mesmo contexto da inclusão, NUNCA

Bruno Gross

unread,
Oct 5, 2011, 3:14:12 PM10/5/11
to dotn...@googlegroups.com
Fábio, tem que olhar o SQL q isso vai gerar. Eu também uso algo semelhante

Fabio Rodrigues e Souza

unread,
Oct 5, 2011, 3:17:48 PM10/5/11
to dotn...@googlegroups.com
Fiquei com trauma do Max qdo vi uma proc que usava Max ao Scope_identity()

Ricardo Noronha de Menezes

unread,
Oct 5, 2011, 3:43:26 PM10/5/11
to dotn...@googlegroups.com
Vamos lá...

No EF se você tem uma entidade chama cliente com um campo Id, setado como Identity, e com auto-incremento, sempre que você der SubmitChanges(), o EF vai incluir a entidade no bd, verificar a Id gerada pelo db, e setar a propriedade do cliente.

Sobre usar Max(), basicamente para um Id é uma gambiarra, quase sempre coincide com o Id, mas existe a possibilidade de retornar um valor errado.





De: Renato Cantarino <renato.c...@gmail.com>
Para: dotn...@googlegroups.com
Enviadas: Quarta-feira, 5 de Outubro de 2011 16:01

Assunto: Re: [.Net - BR] Mvc e Entity Framework - SCOPE_IDENTITY ()

Renato Cantarino

unread,
Oct 5, 2011, 3:48:27 PM10/5/11
to dotn...@googlegroups.com
Ricardo, Obrigado pela contribuição.
Mas o contexto mudou!

Ricardo Noronha de Menezes

unread,
Oct 5, 2011, 4:06:34 PM10/5/11
to dotn...@googlegroups.com
Você quer saber o último Id usado no Bd, em outro contexto? aí sim usa MAX().

Desculpa a desatualização.

Enviadas: Quarta-feira, 5 de Outubro de 2011 16:48

Bernardo Bosak de Rezende

unread,
Oct 5, 2011, 4:11:09 PM10/5/11
to dotn...@googlegroups.com
Tche, se for usar o Max() é preciso atentar para (bem) prováveis problemas de concorrência.



2011/10/5 Ricardo Noronha de Menezes <ricar...@yahoo.com.br>



--
Bernardo Bosak de Rezende
http://bernardorezende.net/ - Arquitetura e Desenvolvimento
https://github.com/bernardobrezende/ - GitHub

"The weather-cock on the church spire, though made of iron, would soon be broken by the storm-wind if it did not understand the noble art of turning to every wind."
Heinrich Heine

Renato Cantarino

unread,
Oct 5, 2011, 4:31:23 PM10/5/11
to dotn...@googlegroups.com
Ricardo,

nao precisa se desculpar. 
Nao estava sendo rudo, nem trolando voce.

um Abraço!

Renato Cantarino

unread,
Oct 5, 2011, 4:31:40 PM10/5/11
to dotn...@googlegroups.com
rude*
Reply all
Reply to author
Forward
0 new messages