Precisamos falar sobre .MDF (Master Database File)
Olá devs, quero compartilhar com vocês uma forma bem fácil de guardar informações no seu protótipo ou projeto para estudo. É bastante frustrante durante o aprendizado ou construção de uma POC (Prova de Conceito) em qual quer linguagem é guardar as informações em memória e após o fim da execução perder tudo, uma vez que pode ser bastante trabalhoso montar todo um "ecossistema" de banco de dados fora da aplicação, uma dica para os .NET Coders de plantão é utilizar o banco dentro da aplicação, claro que deve ser usado com moderação, eu particularmente utilizo dessa formas apenas em POC's, provas e exercícios de faculdade, vou mostrar um jeito fácil para consumir arquivos .MDF dentro da aplicação, para isso preciso que você tenha um conhecimento básico na utilização do Visual Studio e Entity Framework.
Primeiro abra sua solução no Visual Studio é crie um novo arquivo conforme a imagem abaixo:
Agora é só seguir os três passos a baixo e pronto, caso não tenha a seção "Dados" vale apena dar uma olhada na instalação do seu Visual Studio:
"Pronto temos nossa super base de dados e podemos subi-la para produção (...)" Só que não, como dito no começo essa é uma excelente abordagem para bancos de testes já para outros fins considere estudar outras formas, quanto mais dados a tendência e que ele fique bastante lento então não vá exagerar, basta clicar no arquivo e o painel "Gerenciador de Servidores" irá abrir:
Como pode ver abaixo a interface é bastante amigável e de longe lembra o próprio SQL Server Management Studio. Exemplo para acessar a tela abaixo basta clicar com o botão direito sobre a sua base no caso "Dados.mdf" e clicar em "Nova Consulta", agora basta executar suas query's para a construção do seu banco de dados conforme abaixo:
Já que tivemos todo o trabalho de construir nossa base nada mais justo que brincar um pouco com ela, eu irei conduzir utilizando o Entity caso não conheça clique aqui.
Você irá precisar dos seguintes pacotes EntityFrameworkCore, EntityFrameworkCore.Design, EntityFrameworkCore.SqlServer e aproveita que está com o NuGet aberto e baixa o EntityFrameworkCore.Tools caso a gente precise. Uma dica se estiver utilizando .NET Core, a versão desses pacotes devem corresponder a versão do Core que está utilizando, não entendeu? Exemplo se estiver utilizando o Core 3.1 as versões dos pacotes também devem ser 3.1 como Microsoft.EntityFrameworkCore -v 3.1, com isso já te economizei um tempo procurando a versão que não de conflito com a sua solução.
Agora para poupar ainda mais nosso tempo, iremos utilizar a engenharia reversa para criar os nossos models e contexto de forma rápida (O contrário utilizando migrations pode ser feito sem problemas), segue abaixo:
Scaffold-DbContext "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=caminho para o seu arquivo .MDF ;Integrated Security=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context "Nome do seu contexto"
Note que o comando precisa da chave de conexão, um jeito fácil de achar é seguindo a imagem abaixo (Botão direito na sua base>Propriedades > Chave de Conexão):
Como eu gostaria de poder mudar as cores pra deixar bem didático o comando, eu até tentei...
...é eu realmente tentei...
Vamos fazer um pequeno exemplo sem muita pretensão para obter dados da nossa base, o código está meio tosco eu sei, podemos melhora-lo em outro artigo e abordar questões de boas práticas, mas o intuito aqui é outro.
Resultado:
Agora percebem o quanto faz falta uma factory para gerar dados fakes, mas fica o exemplo.
Qual quer outra operação pode ser realizada sem problemas, a grande vantagem é que se diferente de mim você escrever suas consultas já pensando em produção terá um aproveitamento bacana ao rescrever sua POC, com esse conhecimento você já pode abandonar o famigerado .txt das suas apresentações e terá um projeto bem mais enxuto, onde em caso de prova o avaliador não terá que rodar migrations ou importar um .bacpac para corrigi-la, você já envia seus dados de testes junto com o projeto. Como dica final vale lançar mão do Directory para pegar o caminho local do arquivo e montar a chave de conexão dinamicamente, afinal ela deve conter o caminho até seu .MDF, dependendo de onde um terceiro baixar seu projeto o caminho irá mudar, embolei sua cabeça? Então vamos com calma, veja a string que geramos para conectar no banco
Scaffold-DbContext "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Rusley\ConsoleApp1\Dados.mdf;Integrated Security=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context "Contexto"
Note o seguinte trecho C:\Users\Rusley\ConsoleApp1\Dados.mdf, a localização do arquivo Dados.mdf mudara quando um terceiro baixar seu projeto e o Directory irá te ajudar a montar o caminho dinamicamente, mesmo que o terceiro não execute nenhum comando diretamente no banco a cada consulta o contexto precisa desse caminho, dependendo faço outro artigo só dedicado a isso combinado? Enfim, muito obrigado por ler até o final, até a próxima.
E como sempre não deixe de olhar os links, eles podem te ajudar no entendimento do artigo.
Agradecimentos especiais ao Hillgner Kaptzky, a uns três anos atrás me mostrou essa forma fácil de consumir esse tipo de arquivo.