SaveChanges básico

DbContext.SaveChanges() es una de las dos técnicas para guardar los cambios en la base de datos con EF. Con este método, se realizan uno o varios cambios de seguimiento (agregar, actualizar, eliminar) y, a continuación, se aplican esos cambios mediante una llamada al SaveChanges método . Como alternativa, ExecuteUpdate y ExecuteDelete se puede usar sin implicar al rastreador de cambios. Para obtener una comparación introductoria de estas dos técnicas, consulte la página Información general sobre cómo guardar datos.

Sugerencia

Puede ver un ejemplo de este artículo en GitHub.

Agregar datos

Use el DbSet<TEntity>.Add método para agregar nuevas instancias de las clases de entidad. Los datos se insertarán en la base de datos cuando llame a DbContext.SaveChanges():

using (var context = new BloggingContext())
{
    var blog = new Blog { Url = "http://example.com" };
    context.Blogs.Add(blog);
    context.SaveChanges();
}

Sugerencia

Todos Addlos métodos , Attachy Update funcionan en el gráfico completo de entidades pasadas, como se describe en la sección Datos relacionados . También puede usar la propiedad EntityEntry.State para establecer el estado de una sola unidad. Por ejemplo, context.Entry(blog).State = EntityState.Modified.

Actualización de datos

EF detecta automáticamente los cambios realizados en una entidad existente a la que realiza el seguimiento el contexto. Esto incluye entidades que se cargan o consultan desde la base de datos y las entidades que se agregaron y guardaron anteriormente en la base de datos.

Simplemente modifique los valores asignados a las propiedades y, a continuación, llame a SaveChanges:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Single(b => b.Url == "http://example.com");
    blog.Url = "http://example.com/blog";
    context.SaveChanges();
}

Eliminar datos

Use el DbSet<TEntity>.Add método para eliminar instancias de las clases de entidad:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Single(b => b.Url == "http://example.com/blog");
    context.Blogs.Remove(blog);
    context.SaveChanges();
}

Si la entidad ya existe en la base de datos, se eliminará durante SaveChanges. Si la entidad aún no se ha guardado en la base de datos (es decir, se realiza un seguimiento como agregado), se quitará del contexto y ya no se insertará cuando SaveChanges se llame a .

Varias operaciones en una única llamada a SaveChanges

Puede combinar varias operaciones Add/Update/Remove en una sola llamada a SaveChanges:

using (var context = new BloggingContext())
{
    // seeding database
    context.Blogs.Add(new Blog { Url = "http://example.com/blog" });
    context.Blogs.Add(new Blog { Url = "http://example.com/another_blog" });
    context.SaveChanges();
}

using (var context = new BloggingContext())
{
    // add
    context.Blogs.Add(new Blog { Url = "http://example.com/blog_one" });
    context.Blogs.Add(new Blog { Url = "http://example.com/blog_two" });

    // update
    var firstBlog = context.Blogs.First();
    firstBlog.Url = "";

    // remove
    var lastBlog = context.Blogs.OrderBy(e => e.BlogId).Last();
    context.Blogs.Remove(lastBlog);

    context.SaveChanges();
}

Nota:

Para la mayoría de los proveedores de bases de datos, SaveChanges es transaccional. Esto significa que todas las operaciones se realizan correctamente o no y las operaciones nunca se dejan parcialmente aplicadas.