1. Introdução
Cada instância do contexto tem um ChangeTracker, que é responsável para controlar alterações precisam ser escrito para o banco de dados. Quando você alterar o tipo de instâncias de entidade, essas variações são registradas na ChangeTracker, e então quando você chamar SaveChanges serão gravados no banco de dados. Este provedor de banco de dados é responsável pela conversão de alterações específicas para o funcionamento do banco de dados (por exemplo, banco de dados relacional INSERT, UPDATE e comandos DELETE).
2. Guarde Básico
Saiba como usar as classes de contexto e de entidade para adicionar, modificar e dados de exclusão.
2.1 Adicionando dados
Adicionar uma nova instância da classe de entidade utilizando o método DbSet.Add. Quando você chama SaveChanges, os dados serão inseridos no banco de dados.
usando ( var context = new BloggingContext ()) { var blogue = new Blog {url = " http://sample.com " }; context.Blogs.Add (blog); context.SaveChanges (); }
2.2 atualizar dados
EF detecta automaticamente as alterações para a entidade existente rastreado pelo contexto. Isso inclui entidades carregadas a partir da consulta de banco de dados, bem como adicionar e conservar entidade a base de dados antes. Simplesmente atribuindo atributos para modificar, e depois SaveChanges chamada pode ser.
usando ( var context = new BloggingContext ()) { var blogue = context.Blogs.First (); blog.Url = " http://sample.com/blog " ; context.SaveChanges (); }
2.3 dados de exclusão
Use o método DbSet.Remove a exemplo remove de uma classe entidade. Se a entidade já existe no banco de dados, em seguida, excluir a entidade durante SaveChanges. Se a entidade não tiver sido salvo no banco de dados (ou seja, rastreamento é "Added"), quando você chamar SaveChanges, a entidade será removido do contexto e não é mais inserido.
usando ( var context = new BloggingContext ()) { var blogue = context.Blogs.First (); context.Blogs.Remove (blog); context.SaveChanges (); }
2.4 uma pluralidade de operações em uma única SaveChanges
Mais você pode adicionar / operações update / delete em uma única chamada para os SaveChanges.
usando ( var context = new BloggingContext ()) { // adicionar context.Blogs.Add ( novo Blog {url = " http://sample.com/blog_one " }); context.Blogs.Add ( novo Blog {url = " http://sample.com/blog_two " }); // update var firstBlog = context.Blogs.First (); firstBlog.Url = "" ; // remover var lastBlog = context.Blogs.Last (); context.Blogs.Remove (lastBlog); context.SaveChanges (); }
3. Data Save Linked
Em adição a uma entidade independente, mas também a relação definida no modelo pode ser usado.
3.1 Adição de dados associados
Se você também adicionar outras entidades para criar várias novas entidades relacionadas, uma das quais será adicionado ao contexto. No exemplo a seguir, o blog e todos os três artigos relacionados será inserido no banco de dados. Encontrar e adicionar estes artigos, porque eles podem ser acessados através dos Blog.Posts propriedade de navegação.
usando ( var context = new BloggingContext ()) { var blogue = new Blog { Url = " http://blogs.msdn.com/dotnet " , Posts = new List <Post> { nova Pós {Title = " Introdução ao C # " }, nova Pós {Title = " Introdução à VB.NET " }, nova Pós {Title = " Introdução à F # " } } }; context.Blogs.Add (blog); context.SaveChanges (); }
3.2 Adicionando entidades relacionadas
Se a referência dos novos atributos contexto de navegação entidade da entidade foi rastreado, a entidade será encontrado e inserido no banco de dados. No exemplo a seguir, a entidade de inserção pós como a entidade é adicionado a Os posts entidade atribui extraídos da base de dados.
usando ( var context = new BloggingContext ()) { var blogue = context.Blogs.Include (b => b.Posts) .Em primeiro lugar (); var post = new Pós {Title = " Introdução à EF Núcleo " }; blog.Posts.Add (pós); context.SaveChanges (); }
3.3 Mudança de Relacionamento
Se você alterar os atributos de navegação da entidade, então a chave estrangeira no banco de dados muda a coluna correspondente. No exemplo a seguir, para atualizar uma entidade pertencente ao postar nova entidade blogue por causa de sua propriedade para ponto blog de navegação Blog, o blog será inserido no banco de dados, porque é o contexto do pós propriedade de navegação pista tem sido citado nova entidade entidade.
o uso ( var context = new new BloggingContext ()) { // adicionar uma entidade corpo var Blog = new new Blog do url = { " http://blogs.msdn.com/visualstudio " }; var POST = context.Posts.First ( ); // POST atualizar o relacional post.Blog = Blog; context.SaveChanges (); }
4. exclusão em cascata
Remove comportamento definições de tipo DeleteBehavior recenseador, e pode ser transmitida para o controle API OnDelete Fluente:
● pode remover a criança / dependência
valor de chave estrangeira ● criança pode ser definido como nulo
● criança inalterada
Exemplo:
var blogue = context.Blogs.Include (b => b.Posts) .Em primeiro lugar (); var mensagens = blog.Posts.ToList (); DumpEntities ( " Depois de entidades de carregamento: " , o contexto, blogs, publicações); context.Remove (blog); DumpEntities ($ " Depois de eliminar blog {blog.BlogId} ': " , contexto, blogs, publicações); tente { Console.WriteLine (); Console.WriteLine ( " salvar as alterações: " ); context.SaveChanges (); DumpSql (); DumpEntities ( " Após SaveChanges: " , o contexto, blogs, publicações); } Prendedor (exceção e) { DumpSql (); Console.WriteLine (); Console.WriteLine ($ " SaveChanges jogou {. E.GetType () Nome}: {(e é DbUpdateException e.InnerException.Message:? E.Message)} " ); }
resultados recordes:
Depois entidades de carregamento: Blog ' 1 ' é no estado inalterado, com 2 mensagens referenciados. Pós ' 1 ' é no estado inalterado, com FK ' 1 ' e referência para o blog ' 1 ' . Pós ' 2 ' é no estado inalterado, com FK ' 1 ' e referência para o blog ' 1 ' . Após a exclusão do blog ' 1 ' : Blog ' 1 ' é no estado Deleted com 2 mensagens referenciado. Pós ' 1 ' é no estado inalterado, com FK ' 1 ' e referência para o blog ' 1 ' . Pós ' 2 ' é no estado inalterado, com FK ' 1 ' e referência para o blog ' 1 ' . Memoriza as alterações: DELETE FROM [mensagens] ONDE [PostId] = 1 DELETE FROM [mensagens] ONDE [PostId] = 2 DELETE FROM [Blogs] ONDE [blogid] = 1 Depois SaveChanges: Blog ' 1 ' é no estado isolada com 2 mensagens referenciados. Pós ' 1 ' é no estado isolada com FK ' 1 ' e nenhuma referência a um blog. Pós ' 2 ' é no estado isolada com FK ' 1 ' e nenhuma referência a um blog.
5. Transação
Transação atomicamente processo permite que uma pluralidade de operações da base de dados. Se a transação for confirmada, todas as operações serão aplicadas com sucesso ao banco de dados. Se a transação for revertida, então todas as operações não são aplicadas ao banco de dados.
5.1 Operações de controle
DbContext.Database API pode ser usado para iniciar, cometer e transações de reversão. O exemplo a seguir mostra dois consulta LINQ a operação SaveChanges (), e é realizado em uma única operação. Nem todos os bancos de dados fornecem as aplicações suportam transações. Quando você chamar a API de transação, fornecendo algum aplicativo pode lançar uma exceção ou não fazer nada.
usando ( var context = new BloggingContext ()) { usando ( var transação = context.Database.BeginTransaction ()) { try { context.Blogs.Add ( novo Blog {url = " http://blogs.msdn.com/dotnet " }); context.SaveChanges (); context.Blogs.Add ( novo Blog {url = " http://blogs.msdn.com/visualstudio " }); context.SaveChanges (); var blogs = context.Blogs .OrderBy (b => b.Url) .ToList (); // confirmar a transação se todos os comandos ter sucesso, a vontade de transação auto-reversão // quando descartado, se qualquer um dos comandos falhar transaction.commit (); } Prendedor (Exception) { // TODO: falha Handle } } }
6. Resumo
Como razão ocupado, série EF aqui vai chegar a um fim, temporariamente não tem muito tempo para ir no registro. Hoje, este capítulo também roubou um preguiçoso, um pouco mais concisa, explicação oficial específico, vou colar abaixo, por favor me perdoe.
Referências:
Salvar básico
para salvar os dados relevantes
exclusão em cascata
usando transações