.NET CORE WEBAPI

 Tópico anterior Próximo tópico Novo tópico

.NET CORE WEBAPI

C#

 Compartilhe  Compartilhe  Compartilhe
#488548 - 25/04/2019 15:59:17

MESTRE
GUARULHOS
Cadast. em:Novembro/2013


Fala galera beleza? to estudando nos tempos livres Web Api .NET Core 2, EF Core 2 + Angular 7 e Migrations.. porm cheguei em 3 problemas e no consegui resolver..
A solution esta dividida em 4 partes (Domain, Repository, View (<< Angular), WebAPI) e estou usando VSCode e MySQL.

Classe de Domain tenho:
  using System;
using System.Collections.Generic;

namespace Projeto.Domain
{
    public class Cliente
    {
      
      public int CODCLI { get; set; }
      public int CLASSE { get; set; }

      public string RAZCLI { get; set; }
}

1) Tenho uma tabela ja criada, tabela: clientes com o campo CODCLI sendo Primary Key Auto_numeric.. tentei colocar uma DataAnnotation [Key] encima do CODCLI e no foi.. da erro mesmo jogando o using, tentei adicionar.. li na internet e a galera usava o Haskey, ai fui ver e adicionei ao DBCONTEXT :
modelBuilder.Entity<Cliente>()
                .HasKey(c => c.CODCLI);  

Fiz isso certo? o Haskey mostra que CODCLI minha PK ?

Porm cai em outro problema pois a tabela no banco se chama []clientes[] e a classe se chama []Cliente[] ... tem alguma []DataAnnotation[] que posso usar ou algo do tipo pra reconhecer que minha entidade []Cliente[] da tabela []clientes[].. pois a mesma ja existe e a PK dela o CODCLI auto_inc... isso se resolveria basicamente se eu trocasse CODCLI para clienteId (automaticamente iria identificar que uma PK porm no posso alterar pois tenho outros sistemas que utiliza essa tabela ou seja: tem que continuar CODCLI)...

Alguem tem alguma luz??
Abraos galera!

_______________________________________________
[]A alegria est na luta, na tentativa, no sofrimento envolvido e no na vitria propriamente dita.[]
Gandhi.


Resposta escolhida #488549 - 25/04/2019 16:10:25

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Sim, usando o mtodo HasKey que parte da fluent API, o campo especificado no argumento ser chave primria.

Para a pluralizao, voc pode usar dois approaches, um custom convention ou a prpria fluent API.

modelBuilder.Entity<Cliente>()
                .ToTable([]Cliente[])
                .HasKey(c => c.CODCLI);


O custom convention um pouco mais complicado:

using Microsoft.EntityFrameworkCore.Metadata.Internal;

public static class ModelBuilderExtensions
{
    public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
    {
        foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
        {
            entity.Relational().TableName = entity.DisplayName();
        }
    }
}

// E depois sobreescrever o mtodo OnModelCreating:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.RemovePluralizingTableNameConvention();
}


Pessoalmente prefiro o mtodo da fluent API que mais simples e menos []amarrado[]

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#488550 - 25/04/2019 16:14:52

MESTRE
GUARULHOS
Cadast. em:Novembro/2013


Citação:
:
Sim, usando o mtodo HasKey que parte da fluent API, o campo especificado no argumento ser chave primria.

Para a pluralizao, voc pode usar dois approaches, um custom convention ou a prpria fluent API.

modelBuilder.Entity<Cliente>()
                .ToTable([]Cliente[])
                .HasKey(c => c.CODCLI);


O custom convention um pouco mais complicado:

using Microsoft.EntityFrameworkCore.Metadata.Internal;

public static class ModelBuilderExtensions
{
    public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
    {
        foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
        {
            entity.Relational().TableName = entity.DisplayName();
        }
    }
}

// E depois sobreescrever o mtodo OnModelCreating:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.RemovePluralizingTableNameConvention();
}


Pessoalmente prefiro o mtodo da fluent API que mais simples e menos []amarrado[]

Opa Kerp, O do Fluent beleza... porm a tabela se chama clientes ento teria que alterar ficando:
  modelBuilder.Entity<Cliente>()
                .ToTable([]clientes[])
                .HasKey(c => c.CODCLI);

Ta certo? nossa realmente pelo Fluent fica bem mais simples!!

_______________________________________________
[]A alegria est na luta, na tentativa, no sofrimento envolvido e no na vitria propriamente dita.[]
Gandhi.


#488551 - 25/04/2019 16:20:10

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
O mtodo []ToTable[], fora o builder e migration usar esse nome de tabela que voc escolheu. Faa o nome que quiser.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#488552 - 25/04/2019 16:39:44

MESTRE
GUARULHOS
Cadast. em:Novembro/2013


Última edição em 25/04/2019 16:46:59 por MESTRE

Citação:
:
O mtodo []ToTable[], fora o builder e migration usar esse nome de tabela que voc escolheu. Faa o nome que quiser.

Opa muito obrigado Kerp deu certinho, Agora deixa eu te perguntar uma outra coisa.. o projeto que estou aprendendo estava usando SQLite, ai tirei do SQLite e joguei
no MySQL at ai bem sem problemas, porm quando eu salvo no MySQL:

1) Salva PK como zero.. (preciso que ela dizer que ela auto_numeric? )
2) Como crio um chave primaria composta?
3) Se eu tiver campos nulls tem carregando do banco devo fazer algum tratamento? ( tipo algum if string null or empty algo do tipo ? )
4) Tem alguma dica ou sugesto? to gostando bastante desse modelo de diviso um pouco mais desacoplado.

Obs: tanto a 1 como a 2 teriam que ser no onModelCreate? que devo falar o que PK e o que PK_AutoNum



_______________________________________________
[]A alegria est na luta, na tentativa, no sofrimento envolvido e no na vitria propriamente dita.[]
Gandhi.


#488553 - 25/04/2019 17:09:13

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
1 - Para determinar que sua PK auto-gerada pelo banco, use as anotaes:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

2 - Basta incluir os campos que quer como chave primria no mtodo HasKey:

  modelBuilder.Entity<Cliente>()
                .ToTable([]clientes[])
                .HasKey(c => c.CODCLI, c.OUTRO_CAMPO);

3 - Se tiver valores null em campos que voc vai adicionar como chave, voc vai ter um erro. A a coisa complica bastante, porque isso seria uma falha de design de dados e teria que ter um redesign mais complexo.
4 - Voc estindo bem, avanando, sugiro ler a documenao do EF Core, vai abrir alguns caminhos


_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#488572 - 26/04/2019 16:00:15

MESTRE
GUARULHOS
Cadast. em:Novembro/2013


Citação:
:
1 - Para determinar que sua PK auto-gerada pelo banco, use as anotaes:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

2 - Basta incluir os campos que quer como chave primria no mtodo HasKey:

  modelBuilder.Entity<Cliente>()
                .ToTable([]clientes[])
                .HasKey(c => c.CODCLI, c.OUTRO_CAMPO);

3 - Se tiver valores null em campos que voc vai adicionar como chave, voc vai ter um erro. A a coisa complica bastante, porque isso seria uma falha de design de dados e teria que ter um redesign mais complexo.
4 - Voc estindo bem, avanando, sugiro ler a documenao do EF Core, vai abrir alguns caminhos


2) Sobre o [Key] e a [DataBaseGenerated].. no consegui da erro, porm vi na internet que basta adicionar :
protected override void OnModelCreating(ModelBuilder modelBuilder){
    modelBuilder.Entity<Tag>()
        .Property(p => p.ID)
        .ValueGeneratedOnAdd();
}

3) Sobre os valores null eu digo pra outros valores sem ser PK, tipo campos no preenchidos mesmo..

A ultima:
  modelBuilder.Entity<Cliente>()
                .ToTable([]clientes[])
                .HasKey(c => c.CODCLI, c.OUTRO_CAMPO);
Mas e se for uma chave primaria composta onde somente c.CODCLI um auto numerico como ficaria pois se eu colocar o .ValueGeneratedOnAdd como esta acima
mentira pq somente o CODCLI o ValueGeneratedOnAdd que PK AutoNum e o resto somente uma PK..

Opa obrigado kerp.. vou dar uma olhada na documentao..

_______________________________________________
[]A alegria est na luta, na tentativa, no sofrimento envolvido e no na vitria propriamente dita.[]
Gandhi.


#488600 - 28/04/2019 02:31:53

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Chave primria, composta ou simples, os valores devem ser nicos. Voc pode ter um valor null em um dos campos de uma chave primria, a regra que no pode repetir, mas priori, o melhor no ter.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por MESTRE em 17/01/2020 11:00:57