(26) ASP.NET Núcleo EF salvar (básico salve, salve os dados, eliminações em cascata, o uso da transação)

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

Acho que você gosta

Origin www.cnblogs.com/wzk153/p/12449538.html
Recomendado
Clasificación