Diferenças entre o método ADD, ENTRY e ATTACH
- Diferenças entre o método ADD, ENTRY e ATTACH
Obtém um EntityEntry para a entidade fornecida. A entrada fornece acesso a informações e operações de rastreamento de alterações para a entidade.
Vamos ver a diferença entre os métodos Add, Entry e Attach do Entity Framework Core.
Add é para indicar ao Entity Framework que vamos querer inserir um novo registro no banco de dados.
Por outro lado, **Entry** e Attach são usados em cenários onde o registro já existe no banco de dados e simplesmente queremos fazer algum tipo de modificação nele.
No caso de Attach , o objeto é analisado recursivamente e todas as entidades relacionadas são levadas em consideração. No caso de **Entry** , apenas o objeto que você passa para o método Entry é levado em consideração, e não suas entidades relacionadas. Por exemplo: Suponha que temos as entidades Student e Contact. Onde cada Aluno tem uma lista de Contatos correspondente (relação um para muitos). Vejamos um exemplo de Entrada:
Student student1;
using (var context = new ApplicationDbContext())
{
student1 = context.Students.First();
}
student1.Contacts = new List<Contact>();
student1.Contacts.Add(new Contact() { Name= "Contact 1" });
using (var context = new ApplicationDbContext())
{
var entry = context.Entry(student1);
// Only the student entity will be updated, ignoring the contact
entry.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
context.SaveChanges();
}
Apenas o Aluno é atualizado. No entanto, se usarmos Attach:
Student student1;
using (var context = new ApplicationDbContext())
{
student1 = context.Students.First();
}
student1.Contacts = new List<Contact>();
student1.Contacts.Add(new Contact() { Name = "Contact 1" });
using (var context = new ApplicationDbContext())
{
var attach = context.Attach(student1);
// The student will be updated and a contact is going to be created.
attach.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
context.SaveChanges();
}Student student1;
using (var context = new ApplicationDbContext())
{
student1 = context.Students.First();
}
student1.Contacts = new List<Contact>();
student1.Contacts.Add(new Contact() { Name = "Contact 1" });
using (var context = new ApplicationDbContext())
{
var attach = context.Attach(student1);
// The student will be updated and a contact is going to be created.
attach.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
context.SaveChanges();
}Student student1;
using (var context = new ApplicationDbContext())
{
student1 = context.Students.First();
}
student1.Contacts = new List<Contact>();
student1.Contacts.Add(new Contact() { Name = "Contact 1" });
using (var context = new ApplicationDbContext())
{
var attach = context.Attach(student1);
// The student will be updated and a contact is going to be created.
attach.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
context.SaveChanges();
}
Em seguida, o aluno é atualizado e um contato é criado. É importante observar que, se o contato tiver sua chave primária definida, por padrão, o Entity Framework Core não fará nada com o contato.