Os aplicativos ASP.NET CRUD incluem a interação com dados que consistem em criar, ler, atualizar e excluir. Em Parte 1Em seguida, configuramos um projeto básico do ASP.NET Core. Em Parte 2adicionamos o primeiro ler usando uma consulta SQL++ em relação aos dados da lista de desejos. Em Parte 3Adicionamos outro ponto de extremidade de leitura, desta vez usando a API de valor-chave.
Até este ponto, as únicas modificações de dados que fizemos foram diretamente na interface do usuário do Couchbase Capella. Nesta postagem, vamos adicionar um endpoint para lidar com a criação e a atualização dos dados da lista de desejos.
SQL++ versus valor-chave: Revisitado
O SQL++ inclui INSERIR, ATUALIZAÇÃO, DELETE sintaxe. Portanto, poderíamos usar o SQL++ para criar um ponto de extremidade para alterar dados. Ele seria muito semelhante ao código escrito em Parte 2.
Uma palavra-chave no SQL++ que você talvez não tenha visto antes é UPSERT. Como você pode imaginar, é uma combinação de ATUALIZAÇÃO e INSERIR. Uma atualização ocorrerá se os dados já existirem; uma inserção ocorrerá se não existirem. Veja como pode ser um endpoint upsert usando SQL++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[HttpPost] [Rota("api/editWithSql")] público assíncrono Tarefa<IActionResult> CreateOrEditWithSql(Item da lista de desejos item) { var balde = aguardar _bucketProvider.GetBucketAsync("demo"); var agrupamento = balde.Aglomerado; var id = item.Id ?? Guia.NovoGuia(); var resultado = aguardar agrupamento.QueryAsync<Item da lista de desejos>( @"UPSERT INTO demo._default.wishlist (KEY, VALUE) VALUES ($id, { ""name" (nome)" : $name });", opções => opções .Parâmetro("id", id) .Parâmetro("name" (nome), item.Nome) ); retorno Ok(resultado); } |
Há dois aspectos importantes a serem destacados sobre esse código:
-
- Ele lida tanto com a criação quanto com a atualização. Se item tiver um ID nulo, esse código pressupõe que um novo item da lista de desejos está sendo criado.
- Parametrização: assim como nos bancos de dados relacionais, o SQL++ pode ser vulnerável a Injeção de SQLportanto, a parametrização é altamente recomendada. Observe que a sintaxe do SQL++ usa $ para indicar parâmetros nomeados (por exemplo $id e $name).
Esse endpoint funcionará. Mas, como foi o caso em Parte 3Se o Couchbase for um banco de dados, não precisaremos usar o SQL++ para interagir com o Couchbase. De fato, critérios muito semelhantes se aplicam à decisão de quando usar valor-chave e quando usar SQL++:
Caso de uso | Chave-valor? | Por que ou por que não? |
Criar um novo usuário com a chave "73892" | Sim | Acesso direto |
Modificar um usuário com a chave "73892" | Sim | Acesso direto |
Modificar apenas o endereço de e-mail de um usuário com a chave "73892" | Sim | Mesmo que o documento do usuário seja grande, o Couchbase tem um recurso baseado em chave API de subdocumentoque permite que você modifique uma parte do documento. |
Modificar um grupo de usuários com as chaves "73892", "47212" e "90491" | Sim | Isso pode exigir várias operações de valor-chave, mas ainda assim pode ser mais rápido do que usar um SQL SELECT ... WHERE ... IN consulta. |
Modificar todos os endereços para usar "OH" em vez de "Ohio" | Não | O estado do usuário é provavelmente um atributo "secundário", não uma chave (vários usuários podem ser de Ohio). Esse é um bom caso de uso para um SQL++ ATUALIZAÇÃO |
Como esse endpoint só precisa adicionar ou alterar um único item da lista de desejos, vamos usar a API de valor-chave.
Escreva um ponto de extremidade CRUD CreateOrEdit
Antes de começarmos a codificar, é aconselhável pensar se CriarOuEditar deve ser um único ponto de extremidade ou dividido em um Criar e um ponto de extremidade Editar endpoint. Para esse aplicativo de lista de desejos muito simples, não há validação, autenticação ou outras preocupações transversais a todo o sistema. No entanto, em um sistema de produção, "adicionar" dados e "atualizar" dados podem muito bem seguir regras comerciais diferentes e exigir permissões diferentes. Nesse caso, talvez você queira dividir as operações em dois endpoints.
Por enquanto, vamos começar com um único ponto de extremidade que usa um "upsert":
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[HttpPost] [Rota("api/edit")] público assíncrono Tarefa<IActionResult> CriarOuEditar(Item da lista de desejos item) { var balde = aguardar _bucketProvider.GetBucketAsync("demo"); var coleção = aguardar balde.CollectionAsync("lista de desejos"); var id = item.Id ?? Guia.NovoGuia(); aguardar coleção.UpsertAsync(id.ToString(), novo { Nome = item.Nome }); retorno Ok(novo { sucesso = verdadeiro}); } |
Assim como o ponto de extremidade do SQL++, esse ponto de extremidade examina Id para determinar se isso é uma "criação" ou uma "atualização".
O UpsertAsync A função irá:
-
- Criar um novo documento com id.ToString() como a chave
- Modificar um documento existente com uma chave de id.ToString()
Em ambos os casos, quando esse endpoint terminar de ser executado, você terá um documento JSON como { "name" = "nome do item da lista de desejos"} e um GUID como chave (tecnicamente, todas as chaves no Couchbase são strings, mas sabemos que se trata de uma string GUID).
Observação: Uma diferença sutil entre as duas APIs é que o UPSERT só alterará o único campo (nome), enquanto o método de valor-chave UpsertAsync alterará o documento inteiro (que é apenas nome por enquanto).
ASP.NET CRUD em ação
Inicie seu aplicativo no Visual Studio com CTRL+F5, e você verá alguns novos pontos de extremidade aparecerem na interface do usuário do OpenAPI/Swagger:
Do ponto de vista de um consumidor de API, ambos /api/edit e /api/editWithSql funcionarão da mesma forma. Experimente uma vez deixando a ID em branco para criar um novo item e, em seguida, tente novamente com uma ID conhecida (use /api/getall se você precisar obter uma identificação) e observe o que acontece e o que muda.
Por exemplo, adicionei um novo item "Digital Photo Frame", deixando o ID em branco (meu código .NET gerou "1c3de2e7-70ea-4ee2-803b-425bbf6251cb" para mim), e atualizei o item com o ID de "2dab198b-1836-4409-9bdf-17275a2b2462" para ter o nome de "Skyline Chili 2XL T-Shirt". Aqui estão os resultados, conforme vistos na interface do usuário do Couchbase Capella:
O que vem a seguir?
O projeto ASP.NET Core está conectado ao Couchbase Capella e agora está criando/atualizando ("upserting") dados com valor-chave (recomendado) ou SQL++ (não recomendado para essa situação específica).
Na próxima postagem do blog, completaremos o CRUD com "D" de "delete".
Nesse meio tempo, você deve:
-
- Inscreva-se para um teste gratuito do Capella
- Confira o Couchbase Playground para .NET exemplos que você pode executar diretamente no navegador.