Eu tenho trabalhado com o Entity Framework 4 recentemente e estou um pouco confuso sobre quando usar ObjectSet.Attach e ObjectSet.AddObject .
Pelo meu entendimento:
- Use "Anexar" quando uma entidade já existir no sistema
- Use "AddObject" ao criar uma nova entidade
Então, se estou criando uma nova Pessoa , faço isso.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
Se estou modificando uma Pessoa existente , faço o seguinte:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Lembre-se, este é um exemplo muito simples . Na realidade, estou usando Pure POCO (sem geração de código), padrão de repositório (não lida com ctx.Persons) e unidade de trabalho (não lida com ctx.SaveChanges). Mas "debaixo das cobertas", o acima é o que acontece na minha implementação.
Agora, minha pergunta - ainda estou para encontrar um cenário em que tive que usar o Attach .
O que estou perdendo aqui? Quando precisamos usar o Anexar?
EDITAR
Apenas para esclarecer, estou procurando exemplos de quando usar Anexar sobre AddObject (ou vice-versa).
EDIT 2
A resposta abaixo está correta (que eu aceitei), mas pensei em adicionar outro exemplo em que o Attach seria útil.
No meu exemplo acima, para modificar uma Pessoa existente , duas consultas estão realmente sendo executadas.
Um para recuperar a Pessoa (.SingleOrDefault) e outro para executar a UPDATE (.SaveChanges).
Se (por algum motivo), eu já sabia que "Joe Bloggs" existia no sistema, por que fazer uma consulta extra para obtê-lo primeiro? Eu poderia fazer isso:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
Isso resultará em apenas uma instrução UPDATE sendo executada.