diff --git a/.gitignore b/.gitignore index 9491a2f..0ed7bca 100644 --- a/.gitignore +++ b/.gitignore @@ -360,4 +360,534 @@ MigrationBackup/ .ionide/ # Fody - auto-generated XML schema -FodyWeavers.xsd \ No newline at end of file +FodyWeavers.xsd + +# Created by https://www.toptal.com/developers/gitignore/api/visualstudio,aspnetcore +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudio,aspnetcore + +### ASPNETCore ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/ + +### VisualStudio ### +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser + +# User-specific files (MonoDevelop/Xamarin Studio) + +# Mono auto generated files +mono_crash.* + +# Build results +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +# Uncomment if you have tasks that create the project's static files in wwwroot + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results + +# NUnit +nunit-*.xml + +# Build Results of an ATL Project + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_h.h +*.iobj +*.ipdb +*_wpftmp.csproj +*.tlog + +# Chutzpah Test files + +# Visual C++ cache files + +# Visual Studio profiler + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace + +# Guidance Automation Toolkit + +# ReSharper is a .NET coding add-in + +# TeamCity is a build add-in + +# DotCover is a Code Coverage Tool + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results + +# NCrunch + +# MightyMoose + +# Web workbench (sass) + +# Installshield output folder + +# DocProject is a documentation generator add-in + +# Click-Once directory + +# Publish Web Output +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted + +# NuGet Packages +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files + +# Microsoft Azure Build Output + +# Microsoft Azure Emulator + +# Windows Store app package directories and files +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) + +# RIA/Silverlight projects + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.ndf + +# Business Intelligence projects +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes + +# GhostDoc plugin setting file + +# Node.js Tools for Visual Studio + +# Visual Studio 6 build log + +# Visual Studio 6 workspace options file + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files + +# Visual Studio LightSwitch build output + +# Paket dependency manager + +# FAKE - F# Make + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider + +### VisualStudio Patch ### +# Additional files built by Visual Studio + +# End of https://www.toptal.com/developers/gitignore/api/visualstudio,aspnetcore \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0fa3136 --- /dev/null +++ b/README.md @@ -0,0 +1,144 @@ +# Projeto ScreenSound + +Este repositório contém o código fonte do projeto **ScreenSound**. É um aplicativo desktop desenvolvido em C# que permite o cadastro e gerenciamento de informações sobre músicos, suas músicas, álbuns e outros detalhes relevantes. O projeto utiliza o Entity Framework Core para interagir com um banco de dados SQL Server, garantindo a persistência dos dados de forma organizada e eficiente. + +## Pré-requisitos + +- Visual Studio 2022 ou superior +- .NET 7 SDK +- SQL Server Express LocalDB (geralmente instalado junto com o Visual Studio) + +## Primeiro Passo: Criar o Banco de Dados + +Para utilizarmos o SQL Server no projeto, é necessário ter o componente SQL Server Express LocalDB instalado. Normalmente, este componente é instalado com o Visual Studio durante o processo padrão de instalação. No entanto, siga os passos abaixo para verificar se está tudo instalado corretamente: + +1. Abra o **Visual Studio Installer**. +2. Em **Visual Studio Community 2022**, na aba **Instalados**, clique em **Modificar**. +3. Na aba **Componentes Individuais**, pesquise por “sql” na caixa de pesquisa e verifique se o componente **SQL Server Express 2019 LocalDB** está assinalado. + +### Criando o Banco de Dados ScreenSound + +1. No Visual Studio, vá em **Exibir > Pesquisador de Objetos do SQL Server**. Uma janela será aberta na lateral esquerda do Visual Studio. +2. Nessa janela, localize a pasta **Banco de Dados**. Clique com o botão direito sobre ela e selecione **Adicionar Novo Banco de Dados**. +3. Nomeie o banco de dados como **ScreenSound** e clique em **OK**. O banco de dados aparecerá na lista de bancos à esquerda. + +## Segundo Passo: Instalar os Pacotes + +Instale os seguintes pacotes: + +- `Microsoft.Data.SqlClient` versão 5.1.2 +- `Microsoft.EntityFrameworkCore.Design` versão 7.0.14 +- `Microsoft.EntityFrameworkCore.Tools` versão 7.0.14 +- `Microsoft.EntityFrameworkCore.SqlServer` versão 7.0.14 + +### Exemplo com Microsoft.Data.SqlClient no Visual Studio + +1. Vá em **Ferramentas > Gerenciador de Pacotes do NuGet > Gerenciar Pacotes do NuGet para a Solução…**. +2. Na aba **Procurar**, busque por "SQL Client". O primeiro resultado será o `Microsoft.Data.SqlClient`. Marque o projeto **ScreenSound** e clique em **Instalar**. Aceite as licenças para concluir a instalação. + +### Configurando a Conexão + +Para fazer a conexão com o banco de dados: + +1. No Pesquisador de Objetos do SQL Server, clique com o botão direito sobre o banco de dados **ScreenSound** e selecione **Propriedades**. +2. Copie a **Cadeia de Conexão** exibida. + +No seu projeto, crie uma variável privada chamada `connectionString` e atribua a ela as informações copiadas. Remova o valor padrão de `Connect Timeout` (30) para otimizar a execução. + +## Adicionar Migration + +Com os pacotes instalados, adicione a primeira migration ao projeto: + +1. Vá em **Ferramentas > Gerenciador de Pacotes do NuGet > Console do Gerenciador de Pacotes**. +2. Execute o seguinte comando para adicionar a migration inicial: + + ```bash + Add-Migration projetoInicial + ``` + +As migrations são um recurso do Entity Framework que permite gerenciar a estrutura e as versões do banco de dados sem a necessidade de editar scripts SQL manualmente. + +## Adicionar o Pacote Proxies + +1. No Gerenciador de Soluções, clique com o botão direito em **ScreenSound** e selecione **Editar Arquivo do Projeto**. +2. Adicione a seguinte referência no ``: + + ```xml + + ``` + +Salve o arquivo para adicionar o pacote ao projeto. + +### Uso do Pacote Proxies: `UseLazyLoadingProxies()` + +Para usar o pacote Proxies: + +1. No Gerenciador de Soluções, abra a pasta **Banco** e edite o arquivo `ScreenSoundContext.cs`. +2. No método `OnConfiguring()`, adicione `UseLazyLoadingProxies()` após `UseSqlServer()`: + + ```csharp + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder + .UseSqlServer(connectionString) + .UseLazyLoadingProxies(); + } + ``` + +Salve o arquivo para habilitar o uso do pacote no projeto. + +Abaixo está uma descrição informal narrando os passos que executei. + +Primeiro passo é criar o banco de dados +Para utilizarmos o SQL Server no projeto, é preciso que você tenha instalado o seu componente. Geralmente, este componente já é instalado junto com o Visual Studio quando você faz o processo padrão de instalação, mas você pode seguir o passo a passo abaixo para conferir se tudo está instalado corretamente: + +Abra o Visual Studio Installer; +Em Visual Studio Community 2022, na aba instalados, clique em Modificar; +Na aba Componentes individuais, pesquise por “sql” na caixa de pesquisa e verifique se o componente SQL Server Express 2019 LocalDB está assinalado. +Criando o banco de dados ScreenSound : Para criarmos um banco para utilizar na nossa aplicação, vamos em "Exibir > Pesquisador de Objetos do SQL Server". Ao clicar nele, abrirá uma janela na lateral esquerda do Visual Studio. + +Nessa janela do Pesquisador de Objetos é onde vamos conseguir gerenciar o nosso banco. Teremos a pasta "Banco de Dados", e clicando com o botão direito sobre ela, temos a opção "Adicionar Novo Banco de Dados". Vamos selecionar essa opção e criar um banco de dados com o nome do nosso projeto. Portanto, vamos chamá-lo de ScreenSound. + +Após pressionar "Enter" ou clicar em "OK", aparecerá na lista de bancos à esquerda todos os bancos disponíveis, inclusive o ScreenSound que acabamos de criar. +Segundo Passo +instalar os pacotes: +Microsoft.Data.SqlClient 5.1.2, Microsoft Entity Framework Core Design 7.014 , Microsoft Entity Framework Core Tools7.014 e Microsoft Entity Framework Core.SqlServer 7.0.14. + +Exemplo com Microsoft.Data.SqlClient no Visual Studio, vamos em "Ferramentas > Gerenciador de Pacotes do NuGet > Gerenciar Pacotes do NuGet para a Solução…". Na aba "Procurar", vamos pesquisar por "SQL Client". O primeiro exibido será o Microsoft.Data.SqlClient, o qual utilizaremos em nosso projeto para estabelecer o vínculo do banco de dados com o projeto em si. À direita, vamos marcar o projeto ScreenSound e clicar em "Instalar". Para concluir, devemos aceitar as licenças. +Para fazer a conexão, precisamos passar o caminho onde está o banco de dados e mais algumas outras informações de configuração. Para localizar essas informações, vamos ao Pesquisador de Objetos do SQL Server, clicamos com o botão direito sobre o banco de dados ScreenSound e vamos em "Propriedades". + + +Na lateral direita, aparecerão várias informações de propriedade. Precisamos da "Cadeia de conexão". Vamos copiar as informações desse campo para usá-las na classe Connection. + +Feito isso, precisamos trazer essas informações. Elas serão a nossa string de conexão. Portanto, podemos criar um private string que se chamará connectionString. Após o igual (=), passaremos todas as informações copiadas das propriedades do banco. Vamos apenas remover o Connect Timeout que vem por padrão 30, para que a execução seja um pouco mais rápida. + +Adicionar migration +Com os pacotes instalados, precisamos adicionar a primeira migration ao nosso projeto. + +Para fazer isso, vamos em "Ferramentas > Gerenciador de pacotes do NuGet > Console do gerenciador de pacotes". É nesse console que vamos executar os comandos relacionados às migrations. Primeiramente, vamos adicionar essa migration inicial, que é referente ao status inicial do nosso banco. Vamos usar o comando Add. + +Quando escrevemos "Add", se pressionarmos "Tab", ele já começa a sugerir algumas opções. Podemos começar a escrever migration, e a sugestão de que queremos usar essa migration irá aparecer. + +Vamos usar "Tab" novamente para ele autocompletar e também precisamos informar qual será o nome inicial, o nome da nossa primeira migration. Podemos colocar projeto inicial. + +Add-Migration projetoInicial +As migrations são um recurso do Entity que nos permite gerenciar tanto a estrutura do nosso banco quanto as diferentes versões que ele terá durante o projeto, sem precisar mexer nos scripts SQL. +Adicionando o Pacote Proxies +No nosso Gerenciador de Soluções, clicamos em ScreenSound com o botão direito e selecionamos a opção "Editar Arquivo do Projeto". Esse arquivo tem algumas configurações do nosso projeto, e é no que vamos adicionar a referência para o nosso pacote. +Após o fechamento da última referência de pacote adicionada, vamos colar a referência que + +Essa referência de pacote que adicionamos inclui o Microsoft Entity Framework Core Proxies na versão 7.0.14. Agora salvamos o arquivo, e pronto! O pacote já foi adicionado ao projeto. +Uso do pacote Proxies: UseLazyLoadingProxies() +O próximo passo para utilizar esse pacote no nosso projeto é ir ao Gerenciador de Soluções, na nossa pasta "Banco", para abrir o arquivo ScreenSoundContext.cs. + +Nesse arquivo, onde temos um OnConfiguring(), precisamos adicionar um novo Use. No momento, temos o UseSqlServer(), e logo depois dele vamos colocar um ponto e UseLazyLoadingProxies(). Através desse Use, vamos conseguir realmente utilizar o nosso pacote. +ScreenSoundContext.cs +protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) +{ + optionsBuilder + .UseSqlServer(connectionString) + .UseLazyLoadingProxies(); +} +Ao salvar o arquivo, já podemos utilizar o pacote em nosso projeto. + + diff --git a/ScreenSound/Banco/DAL.cs b/ScreenSound/Banco/DAL.cs new file mode 100644 index 0000000..bb4e1b2 --- /dev/null +++ b/ScreenSound/Banco/DAL.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ScreenSound.Banco; +internal class DAL where T : class +{ + protected readonly ScreenSoundContext context; + + public DAL(ScreenSoundContext context) + { + this.context = context; + } + + public IEnumerable Listar() + { + return context.Set().ToList(); + } + public IEnumerable ListarPor(Func condicao) + { + return context.Set().Where(condicao); + } + + public void Adicionar(T objeto) + { + context.Set().Add(objeto); + context.SaveChanges(); + } + public void Atualizar(T objeto) + { + context.Set().Update(objeto); + context.SaveChanges(); + } + public void Deletar(T objeto) + { + context.Set().Remove(objeto); + context.SaveChanges(); + } + + public T? RecuperarPor(Func condicao) + { + return context.Set().FirstOrDefault(condicao); + } +} diff --git a/ScreenSound/Banco/ScreenSoundContext.cs b/ScreenSound/Banco/ScreenSoundContext.cs new file mode 100644 index 0000000..c53fc92 --- /dev/null +++ b/ScreenSound/Banco/ScreenSoundContext.cs @@ -0,0 +1,27 @@ +using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; +using ScreenSound.Modelos; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ScreenSound.Banco +{ + internal class ScreenSoundContext: DbContext + { + public DbSet Artistas { get; set; } + public DbSet Musica { get; set; } + + private string connectionString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=ScreenSoundV0;" + + "Integrated Security=True;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;" + + "Multi Subnet Failover=False"; + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlServer(connectionString).UseLazyLoadingProxies(); + } + + + } +} diff --git a/ScreenSound/Menus/Menu.cs b/ScreenSound/Menus/Menu.cs index 25db9e7..a336b1b 100644 --- a/ScreenSound/Menus/Menu.cs +++ b/ScreenSound/Menus/Menu.cs @@ -1,4 +1,5 @@ -using ScreenSound.Modelos; +using ScreenSound.Banco; +using ScreenSound.Modelos; namespace ScreenSound.Menus; @@ -12,7 +13,7 @@ public void ExibirTituloDaOpcao(string titulo) Console.WriteLine(titulo); Console.WriteLine(asteriscos + "\n"); } - public virtual void Executar(Dictionary nusicasRegistradas) + public virtual void Executar(DAL artistaDAL) { Console.Clear(); } diff --git a/ScreenSound/Menus/MenuMostrarArtistas.cs b/ScreenSound/Menus/MenuMostrarArtistas.cs index 07d992c..4f00ece 100644 --- a/ScreenSound/Menus/MenuMostrarArtistas.cs +++ b/ScreenSound/Menus/MenuMostrarArtistas.cs @@ -1,15 +1,16 @@ -using ScreenSound.Modelos; +using ScreenSound.Banco; +using ScreenSound.Modelos; namespace ScreenSound.Menus; internal class MenuMostrarArtistas : Menu { - public override void Executar(Dictionary musicasRegistradas) + public override void Executar(DAL artistaDAL) { - base.Executar(musicasRegistradas); + base.Executar(artistaDAL); ExibirTituloDaOpcao("Exibindo todos os artistas registradas na nossa aplicação"); - foreach (string artista in musicasRegistradas.Keys) + foreach (var artista in artistaDAL.Listar()) { Console.WriteLine($"Artista: {artista}"); } diff --git a/ScreenSound/Menus/MenuMostrarMusicas.cs b/ScreenSound/Menus/MenuMostrarMusicas.cs index f176506..634cdce 100644 --- a/ScreenSound/Menus/MenuMostrarMusicas.cs +++ b/ScreenSound/Menus/MenuMostrarMusicas.cs @@ -1,20 +1,21 @@ -using ScreenSound.Modelos; +using ScreenSound.Banco; +using ScreenSound.Modelos; namespace ScreenSound.Menus; internal class MenuMostrarMusicas : Menu { - public override void Executar(Dictionary artistasRegistrados) + public override void Executar(DAL artistaDAL) { - base.Executar(artistasRegistrados); + base.Executar(artistaDAL); ExibirTituloDaOpcao("Exibir detalhes do artista"); Console.Write("Digite o nome do artista que deseja conhecer melhor: "); string nomeDoArtista = Console.ReadLine()!; - if (artistasRegistrados.ContainsKey(nomeDoArtista)) + var artistaRecuperado = artistaDAL.RecuperarPor(a => a.Nome.Equals(nomeDoArtista)); + if (artistaRecuperado is not null) { - Artista artista = artistasRegistrados[nomeDoArtista]; Console.WriteLine("\nDiscografia:"); - artista.ExibirDiscografia(); + artistaRecuperado.ExibirDiscografia(); Console.WriteLine("\nDigite uma tecla para voltar ao menu principal"); Console.ReadKey(); Console.Clear(); diff --git a/ScreenSound/Menus/MenuMostrarMusicasPorAno.cs b/ScreenSound/Menus/MenuMostrarMusicasPorAno.cs new file mode 100644 index 0000000..a8c0707 --- /dev/null +++ b/ScreenSound/Menus/MenuMostrarMusicasPorAno.cs @@ -0,0 +1,42 @@ +using ScreenSound.Banco; +using ScreenSound.Modelos; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ScreenSound.Menus +{ + internal class MenuMostrarMusicasPorAno : Menu + { + public override void Executar(DAL artistaDAL) + { + base.Executar(artistaDAL); + ExibirTituloDaOpcao("Mostrar musicas por ano de lançamento"); + Console.Write("Digite o ano para consultar músicas:"); + string anoLancamento = Console.ReadLine()!; + var musicaDal = new DAL(new ScreenSoundContext()); + var listaAnoLancamento = musicaDal.ListarPor(a => a.AnoLancamento == Convert.ToInt32(anoLancamento)); + if (listaAnoLancamento.Any()) + { + Console.WriteLine($"\nMusicas do Ano {anoLancamento}:"); + foreach (var musica in listaAnoLancamento) + { + musica.ExibirFichaTecnica(); + } + Console.WriteLine("\nDigite uma tecla para voltar ao menu principal"); + Console.ReadKey(); + Console.Clear(); + } + else + { + Console.WriteLine($"\nO ano {anoLancamento} não foi encontrada!"); + Console.WriteLine("Digite uma tecla para voltar ao menu principal"); + Console.ReadKey(); + Console.Clear(); + } + } + } + +} diff --git a/ScreenSound/Menus/MenuRegistrarArtista.cs b/ScreenSound/Menus/MenuRegistrarArtista.cs index e01bfd7..10aae0d 100644 --- a/ScreenSound/Menus/MenuRegistrarArtista.cs +++ b/ScreenSound/Menus/MenuRegistrarArtista.cs @@ -1,19 +1,20 @@ -using ScreenSound.Modelos; +using ScreenSound.Banco; +using ScreenSound.Modelos; namespace ScreenSound.Menus; internal class MenuRegistrarArtista : Menu { - public override void Executar(Dictionary artistasRegistrados) + public override void Executar(DAL artistaDAL) { - base.Executar(artistasRegistrados); + base.Executar(artistaDAL); ExibirTituloDaOpcao("Registro dos Artistas"); Console.Write("Digite o nome do artista que deseja registrar: "); string nomeDoArtista = Console.ReadLine()!; Console.Write("Digite a bio do artista que deseja registrar: "); string bioDoArtista = Console.ReadLine()!; Artista artista = new Artista(nomeDoArtista, bioDoArtista); - artistasRegistrados.Add(nomeDoArtista, artista); + artistaDAL.Adicionar(artista); Console.WriteLine($"O artista {nomeDoArtista} foi registrado com sucesso!"); Thread.Sleep(4000); Console.Clear(); diff --git a/ScreenSound/Menus/MenuRegistrarMusica.cs b/ScreenSound/Menus/MenuRegistrarMusica.cs index 023caff..9090a27 100644 --- a/ScreenSound/Menus/MenuRegistrarMusica.cs +++ b/ScreenSound/Menus/MenuRegistrarMusica.cs @@ -1,22 +1,26 @@ -using ScreenSound.Modelos; +using ScreenSound.Banco; +using ScreenSound.Modelos; namespace ScreenSound.Menus; internal class MenuRegistrarMusica : Menu { - public override void Executar(Dictionary artistasRegistrados) + public override void Executar(DAL artistaDAL) { - base.Executar(artistasRegistrados); + base.Executar(artistaDAL); ExibirTituloDaOpcao("Registro de músicas"); Console.Write("Digite o artista cuja música deseja registrar: "); string nomeDoArtista = Console.ReadLine()!; - if (artistasRegistrados.ContainsKey(nomeDoArtista)) + var artistaRecuperado = artistaDAL.RecuperarPor(a => a.Nome.Equals(nomeDoArtista)); + if (artistaRecuperado is not null) { Console.Write("Agora digite o título da música: "); string tituloDaMusica = Console.ReadLine()!; - Artista artista = artistasRegistrados[nomeDoArtista]; - artista.AdicionarMusica(new Musica(tituloDaMusica)); + Console.Write("Agora digite o ano de lançamento da música: "); + string anoLancamento = Console.ReadLine()!; + artistaRecuperado.AdicionarMusica(new Musica(tituloDaMusica) { AnoLancamento = Convert.ToInt32(anoLancamento)}); Console.WriteLine($"A música {tituloDaMusica} de {nomeDoArtista} foi registrada com sucesso!"); + artistaDAL.Atualizar(artistaRecuperado); Thread.Sleep(4000); Console.Clear(); } diff --git a/ScreenSound/Menus/MenuSair.cs b/ScreenSound/Menus/MenuSair.cs index 0c10e75..c4d4dca 100644 --- a/ScreenSound/Menus/MenuSair.cs +++ b/ScreenSound/Menus/MenuSair.cs @@ -1,10 +1,11 @@ -using ScreenSound.Modelos; +using ScreenSound.Banco; +using ScreenSound.Modelos; namespace ScreenSound.Menus; internal class MenuSair : Menu { - public override void Executar(Dictionary artistasRegistrados) + public override void Executar(DAL artistaDAL) { Console.WriteLine("Tchau tchau :)"); } diff --git a/ScreenSound/Migrations/20240329212013_projetoInicial.Designer.cs b/ScreenSound/Migrations/20240329212013_projetoInicial.Designer.cs new file mode 100644 index 0000000..c6388e1 --- /dev/null +++ b/ScreenSound/Migrations/20240329212013_projetoInicial.Designer.cs @@ -0,0 +1,71 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ScreenSound.Banco; + +#nullable disable + +namespace ScreenSound.Migrations +{ + [DbContext(typeof(ScreenSoundContext))] + [Migration("20240329212013_projetoInicial")] + partial class projetoInicial + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.14") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("ScreenSound.Modelos.Artista", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Bio") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FotoPerfil") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Artistas"); + }); + + modelBuilder.Entity("ScreenSound.Modelos.Musica", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Musica"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ScreenSound/Migrations/20240329212013_projetoInicial.cs b/ScreenSound/Migrations/20240329212013_projetoInicial.cs new file mode 100644 index 0000000..07dbede --- /dev/null +++ b/ScreenSound/Migrations/20240329212013_projetoInicial.cs @@ -0,0 +1,52 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ScreenSound.Migrations +{ + /// + public partial class projetoInicial : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Artistas", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Nome = table.Column(type: "nvarchar(max)", nullable: false), + FotoPerfil = table.Column(type: "nvarchar(max)", nullable: false), + Bio = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Artistas", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Musica", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Nome = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Musica", x => x.Id); + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Artistas"); + + migrationBuilder.DropTable( + name: "Musica"); + } + } +} diff --git a/ScreenSound/Migrations/20240330194357_PopularTabela.Designer.cs b/ScreenSound/Migrations/20240330194357_PopularTabela.Designer.cs new file mode 100644 index 0000000..6b0de9d --- /dev/null +++ b/ScreenSound/Migrations/20240330194357_PopularTabela.Designer.cs @@ -0,0 +1,71 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ScreenSound.Banco; + +#nullable disable + +namespace ScreenSound.Migrations +{ + [DbContext(typeof(ScreenSoundContext))] + [Migration("20240330194357_PopularTabela")] + partial class PopularTabela + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.14") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("ScreenSound.Modelos.Artista", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Bio") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FotoPerfil") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Artistas"); + }); + + modelBuilder.Entity("ScreenSound.Modelos.Musica", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Musica"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ScreenSound/Migrations/20240330194357_PopularTabela.cs b/ScreenSound/Migrations/20240330194357_PopularTabela.cs new file mode 100644 index 0000000..583a181 --- /dev/null +++ b/ScreenSound/Migrations/20240330194357_PopularTabela.cs @@ -0,0 +1,35 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ScreenSound.Migrations +{ + /// + public partial class PopularTabela : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.InsertData("Artistas", new string[] { "Nome", "Bio", "FotoPerfil" }, new object[] { "Djavan", "Djavan Caetano Viana é um cantor, compositor, arranjador, produtor musical, empresário, violonista e ex-futebolista brasileiro.", "https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_1280.png" }); + + migrationBuilder.InsertData("Artistas", new string[] { "Nome", "Bio", "FotoPerfil" }, new object[] { "Foo Fighters", "Foo Fighters é uma banda de rock alternativo americana formada por Dave Grohl em 1995.", "https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_1280.png" }); + + migrationBuilder.InsertData("Artistas", new string[] { "Nome", "Bio", "FotoPerfil" }, new object[] { "Pitty", "Priscilla Novaes Leone, mais conhecida como Pitty, é uma cantora, compositora, produtora, escritora, empresária, apresentadora e multi-instrumentista brasileira.", "https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_1280.png" }); + + migrationBuilder.InsertData("Artistas", new string[] { "Nome", "Bio", "FotoPerfil" }, new object[] { "Gilberto Gil", "Gilberto Passos Gil Moreira é um cantor, compositor, multi-instrumentista, produtor musical, político e escritor brasileiro.", "https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_1280.png" }); + + migrationBuilder.InsertData("Artistas", new string[] { "Nome", "Bio", "FotoPerfil" }, new object[] { "Foo Fighters", "Foo Fighters é uma banda de rock alternativo americana formada por Dave Grohl em 1995.", "https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_1280.png" }); + + migrationBuilder.InsertData("Artistas", new string[] { "Nome", "Bio", "FotoPerfil" }, new object[] { "Pitty", "Priscilla Novaes Leone, mais conhecida como Pitty, é uma cantora, compositora, produtora, escritora, empresária, apresentadora e multi-instrumentista brasileira.", "https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_1280.png" }); + + migrationBuilder.InsertData("Artistas", new string[] { "Nome", "Bio", "FotoPerfil" }, new object[] { "Roque Abílio", "Recriando músicas famosas com uma reviravolta rockabilly, a Roque Abílio cativa o público com uma explosão autêntica do passado que ainda faz todo mundo dançar no presente.", "https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_1280.png" }); + } + + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.Sql("DELETE FROM Artistas"); + } + } +} diff --git a/ScreenSound/Migrations/20240330201713_AdicionarColunaAnoLancamento.Designer.cs b/ScreenSound/Migrations/20240330201713_AdicionarColunaAnoLancamento.Designer.cs new file mode 100644 index 0000000..ef576ad --- /dev/null +++ b/ScreenSound/Migrations/20240330201713_AdicionarColunaAnoLancamento.Designer.cs @@ -0,0 +1,75 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ScreenSound.Banco; + +#nullable disable + +namespace ScreenSound.Migrations +{ + [DbContext(typeof(ScreenSoundContext))] + [Migration("20240330201713_AdicionarColunaAnoLancamento")] + partial class AdicionarColunaAnoLancamento + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.14") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("ScreenSound.Modelos.Artista", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Bio") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FotoPerfil") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Artistas"); + }); + + modelBuilder.Entity("ScreenSound.Modelos.Musica", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AnoLancamento") + .HasColumnType("int"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Musica"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ScreenSound/Migrations/20240330201713_AdicionarColunaAnoLancamento.cs b/ScreenSound/Migrations/20240330201713_AdicionarColunaAnoLancamento.cs new file mode 100644 index 0000000..5f13ddc --- /dev/null +++ b/ScreenSound/Migrations/20240330201713_AdicionarColunaAnoLancamento.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ScreenSound.Migrations +{ + /// + public partial class AdicionarColunaAnoLancamento : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "AnoLancamento", + table: "Musica", + type: "int", + nullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "AnoLancamento", + table: "Musica"); + } + } +} diff --git a/ScreenSound/Migrations/20240330222129_PopularMusica.Designer.cs b/ScreenSound/Migrations/20240330222129_PopularMusica.Designer.cs new file mode 100644 index 0000000..2ad4ea2 --- /dev/null +++ b/ScreenSound/Migrations/20240330222129_PopularMusica.Designer.cs @@ -0,0 +1,75 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ScreenSound.Banco; + +#nullable disable + +namespace ScreenSound.Migrations +{ + [DbContext(typeof(ScreenSoundContext))] + [Migration("20240330222129_PopularMusica")] + partial class PopularMusica + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.14") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("ScreenSound.Modelos.Artista", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Bio") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FotoPerfil") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Artistas"); + }); + + modelBuilder.Entity("ScreenSound.Modelos.Musica", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AnoLancamento") + .HasColumnType("int"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Musica"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ScreenSound/Migrations/20240330222129_PopularMusica.cs b/ScreenSound/Migrations/20240330222129_PopularMusica.cs new file mode 100644 index 0000000..20ad58c --- /dev/null +++ b/ScreenSound/Migrations/20240330222129_PopularMusica.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ScreenSound.Migrations +{ + /// + public partial class PopularMusica : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.InsertData("Musica", new string[] { "Nome", "AnoLancamento" }, new object[] { "Oceano", 1989 }); + + migrationBuilder.InsertData("Musica", new string[] { "Nome", "AnoLancamento" }, new object[] { "Flor de Lis", 1976 }); + + migrationBuilder.InsertData("Musica", new string[] { "Nome", "AnoLancamento" }, new object[] { "Samurai", 1982 }); + + migrationBuilder.InsertData("Musica", new string[] { "Nome", "AnoLancamento" }, new object[] { "Se", 1992 }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.Sql("DELETE FROM Artistas"); + } + } +} diff --git a/ScreenSound/Migrations/20240402005459_RelacionarArtistaMusica.Designer.cs b/ScreenSound/Migrations/20240402005459_RelacionarArtistaMusica.Designer.cs new file mode 100644 index 0000000..ae1b872 --- /dev/null +++ b/ScreenSound/Migrations/20240402005459_RelacionarArtistaMusica.Designer.cs @@ -0,0 +1,94 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ScreenSound.Banco; + +#nullable disable + +namespace ScreenSound.Migrations +{ + [DbContext(typeof(ScreenSoundContext))] + [Migration("20240402005459_RelacionarArtistaMusica")] + partial class RelacionarArtistaMusica + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.14") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("ScreenSound.Modelos.Artista", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Bio") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FotoPerfil") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Artistas"); + }); + + modelBuilder.Entity("ScreenSound.Modelos.Musica", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AnoLancamento") + .HasColumnType("int"); + + b.Property("ArtistaId") + .HasColumnType("int"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ArtistaId"); + + b.ToTable("Musica"); + }); + + modelBuilder.Entity("ScreenSound.Modelos.Musica", b => + { + b.HasOne("ScreenSound.Modelos.Artista", "Artista") + .WithMany("Musicas") + .HasForeignKey("ArtistaId"); + + b.Navigation("Artista"); + }); + + modelBuilder.Entity("ScreenSound.Modelos.Artista", b => + { + b.Navigation("Musicas"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ScreenSound/Migrations/20240402005459_RelacionarArtistaMusica.cs b/ScreenSound/Migrations/20240402005459_RelacionarArtistaMusica.cs new file mode 100644 index 0000000..d4f4a84 --- /dev/null +++ b/ScreenSound/Migrations/20240402005459_RelacionarArtistaMusica.cs @@ -0,0 +1,48 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ScreenSound.Migrations +{ + /// + public partial class RelacionarArtistaMusica : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ArtistaId", + table: "Musica", + type: "int", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_Musica_ArtistaId", + table: "Musica", + column: "ArtistaId"); + + migrationBuilder.AddForeignKey( + name: "FK_Musica_Artistas_ArtistaId", + table: "Musica", + column: "ArtistaId", + principalTable: "Artistas", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Musica_Artistas_ArtistaId", + table: "Musica"); + + migrationBuilder.DropIndex( + name: "IX_Musica_ArtistaId", + table: "Musica"); + + migrationBuilder.DropColumn( + name: "ArtistaId", + table: "Musica"); + } + } +} diff --git a/ScreenSound/Migrations/ScreenSoundContextModelSnapshot.cs b/ScreenSound/Migrations/ScreenSoundContextModelSnapshot.cs new file mode 100644 index 0000000..e0b3905 --- /dev/null +++ b/ScreenSound/Migrations/ScreenSoundContextModelSnapshot.cs @@ -0,0 +1,91 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ScreenSound.Banco; + +#nullable disable + +namespace ScreenSound.Migrations +{ + [DbContext(typeof(ScreenSoundContext))] + partial class ScreenSoundContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.14") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("ScreenSound.Modelos.Artista", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Bio") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FotoPerfil") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Artistas"); + }); + + modelBuilder.Entity("ScreenSound.Modelos.Musica", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AnoLancamento") + .HasColumnType("int"); + + b.Property("ArtistaId") + .HasColumnType("int"); + + b.Property("Nome") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ArtistaId"); + + b.ToTable("Musica"); + }); + + modelBuilder.Entity("ScreenSound.Modelos.Musica", b => + { + b.HasOne("ScreenSound.Modelos.Artista", "Artista") + .WithMany("Musicas") + .HasForeignKey("ArtistaId"); + + b.Navigation("Artista"); + }); + + modelBuilder.Entity("ScreenSound.Modelos.Artista", b => + { + b.Navigation("Musicas"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ScreenSound/Modelos/Artista.cs b/ScreenSound/Modelos/Artista.cs index 6fcb97b..3cd495b 100644 --- a/ScreenSound/Modelos/Artista.cs +++ b/ScreenSound/Modelos/Artista.cs @@ -1,8 +1,8 @@ namespace ScreenSound.Modelos; -internal class Artista +public class Artista { - private List musicas = new List(); + public virtual ICollection Musicas { get; set; } = new List(); public Artista(string nome, string bio) { @@ -18,15 +18,16 @@ public Artista(string nome, string bio) public void AdicionarMusica(Musica musica) { - musicas.Add(musica); + Musicas.Add(musica); } public void ExibirDiscografia() { Console.WriteLine($"Discografia do artista {Nome}"); - foreach (var musica in musicas) + foreach (var musica in Musicas) { - Console.WriteLine($"Música: {musica.Nome}"); + Console.WriteLine($"Música: {musica.Nome} - Ano de Lançamento: {musica.AnoLancamento}"); + } } diff --git a/ScreenSound/Modelos/Musica.cs b/ScreenSound/Modelos/Musica.cs index b6c8779..d8f8d4a 100644 --- a/ScreenSound/Modelos/Musica.cs +++ b/ScreenSound/Modelos/Musica.cs @@ -1,6 +1,6 @@ namespace ScreenSound.Modelos; -internal class Musica +public class Musica { public Musica(string nome) { @@ -9,7 +9,8 @@ public Musica(string nome) public string Nome { get; set; } public int Id { get; set; } - + public int? AnoLancamento { get; set; } + public virtual Artista? Artista { get; set; } public void ExibirFichaTecnica() { Console.WriteLine($"Nome: {Nome}"); diff --git a/ScreenSound/Program.cs b/ScreenSound/Program.cs index 3e7588a..6b8343d 100644 --- a/ScreenSound/Program.cs +++ b/ScreenSound/Program.cs @@ -1,18 +1,16 @@ -using ScreenSound.Menus; +using ScreenSound.Banco; +using ScreenSound.Menus; using ScreenSound.Modelos; -Artista ira = new Artista("Ira!", "Banda Ira!"); -Artista beatles = new("The Beatles", "Banda The Beatles"); - -Dictionary artistasRegistrados = new(); -artistasRegistrados.Add(ira.Nome, ira); -artistasRegistrados.Add(beatles.Nome, beatles); +var context = new ScreenSoundContext(); +var artistaDAL = new DAL(context); Dictionary opcoes = new(); opcoes.Add(1, new MenuRegistrarArtista()); opcoes.Add(2, new MenuRegistrarMusica()); opcoes.Add(3, new MenuMostrarArtistas()); opcoes.Add(4, new MenuMostrarMusicas()); +opcoes.Add(5, new MenuMostrarMusicasPorAno()); opcoes.Add(-1, new MenuSair()); void ExibirLogo() @@ -36,6 +34,7 @@ void ExibirOpcoesDoMenu() Console.WriteLine("Digite 2 para registrar a música de um artista"); Console.WriteLine("Digite 3 para mostrar todos os artistas"); Console.WriteLine("Digite 4 para exibir todas as músicas de um artista"); + Console.WriteLine("Digite 5 para exibir as músicas por ano de lançamento"); Console.WriteLine("Digite -1 para sair"); Console.Write("\nDigite a sua opção: "); @@ -45,9 +44,9 @@ void ExibirOpcoesDoMenu() if (opcoes.ContainsKey(opcaoEscolhidaNumerica)) { Menu menuASerExibido = opcoes[opcaoEscolhidaNumerica]; - menuASerExibido.Executar(artistasRegistrados); + menuASerExibido.Executar(artistaDAL); if (opcaoEscolhidaNumerica > 0) ExibirOpcoesDoMenu(); - } + } else { Console.WriteLine("Opção inválida"); diff --git a/ScreenSound/ScreenSound.csproj b/ScreenSound/ScreenSound.csproj index ebc9f8f..0cf3833 100644 --- a/ScreenSound/ScreenSound.csproj +++ b/ScreenSound/ScreenSound.csproj @@ -11,4 +11,19 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + +