GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Dúvida de mapeamentos de relacionamentos e inserção no banco - Entity Framework Core

csharp
sqlserver
mvc
entityframework
aspnet
Tags: #<Tag:0x00007fea91b8a2a8> #<Tag:0x00007fea91b8a078> #<Tag:0x00007fea91b89ec0> #<Tag:0x00007fea91b89d58> #<Tag:0x00007fea91b89bc8>

#1

Galera é o seguinte, eu tenho uma tabela Vendedor, outra TipoVendedor e nessas tenho o VendedorTipo indicando as chaves das outras duas e com colunas para servir como um histórico para a empresa quando precisar. Na regra de negócio implementada aqui, o relacionamento entre Vendedor e TipoVendedor é 1 : 1, e fiz o entity gerar os models e a implementação de DbContext porque a base já é existente (Database First) através daquele comando Scaffold-DbContext.

Agora é o seguinte na hora de eu adicionar um vendedor no banco como devo fazer, porque dessa forma me parece que preciso adicionar o Vendedor depois a TipoVendedor e depois a VendedorTipo, tendo que toda hora recuperar as chaves dessas outras duas tabelas para adicionar na outra, e isso não é legal nem consistente certo? Queria adicionar uma tabela no banco como no curso, onde adicionaria o Vendedor ou a TipoVendedorno banco e o entity cuidava das outras duas.

Segue códigos e entidades para melhor entendimento:

Classe Vendedor:

public partial class Vendedor
    {
    public long IdVendedor { get; set; }
    public string Nome { get; set; }
    public string CpfCnpj { get; set; }
    public string RgIe { get; set; }
    public string NomeRazao { get; set; }
    public string Url { get; set; }
    public string Obs { get; set; }
    public DateTime Inclusao { get; set; }
    public long IdUsuarioInc { get; set; }
    public DateTime? Alteracao { get; set; }
    public long? IdUsuarioAlt { get; set; }

    public Usuario IdUsuarioIncNavigation { get; set; }
}

Entidade Vendedor:

CREATE TABLE [dbo].[Vendedor] (
[IdVendedor]   BIGINT         IDENTITY (1, 1) NOT NULL,
[Nome]         NVARCHAR (250) NOT NULL,
[CpfCnpj]      NVARCHAR (15)  NOT NULL,
[RgIe]         NVARCHAR (30)  NULL,
[NomeRazao]    NVARCHAR (250) NOT NULL,
[Url]          NVARCHAR (250) NULL,
[Obs]          NVARCHAR (250) NULL,
[Inclusao]     DATETIME       NOT NULL,
[Alteracao]    DATETIME       NULL,
CONSTRAINT [PK_Vendedor] PRIMARY KEY CLUSTERED ([IdVendedor] ASC)
CONSTRAINT [FK_Vendedor_Usuario] FOREIGN KEY ([IdUsuarioInc]) REFERENCES [dbo].[Usuario] ([IdUsuario])
);

Classe TipoVendedor:

public partial class TipoVendedor
{
    public long IdTipoVendedor { get; set; }
    public string Nome { get; set; }
    public string Descricao { get; set; }
}

Entidade TipoVendedor:

CREATE TABLE [dbo].[TipoVendedor] (
[IdTipoVendedor] BIGINT        IDENTITY (1, 1) NOT NULL,
[Nome]           VARCHAR (50)  NOT NULL,
[Descricao]      VARCHAR (250) NOT NULL,
CONSTRAINT [PK_TipoVendedor] PRIMARY KEY CLUSTERED ([IdTipoVendedor] ASC)
);

Classe VendedorTipo:

public partial class VendedorTipo
{
    public long IdVendedor { get; set; }
    public long IdTipoVendedor { get; set; }
    public long IdUsuarioInclusao { get; set; }
    public DateTime Inclusao { get; set; }
    public long? IdUsuarioInativo { get; set; }
    public DateTime? Inativo { get; set; }
}

Entidade VendedorTipo:

CREATE TABLE [dbo].[VendedorTipo] (
[IdVendedor]        BIGINT   NOT NULL,
[IdTipoVendedor]    BIGINT   NOT NULL,
[IdUsuarioInclusao] BIGINT   NOT NULL,
[Inclusao]          DATETIME NOT NULL,
[IdUsuarioInativo]  BIGINT   NULL,
[Inativo]           DATETIME NULL,
CONSTRAINT [PK_VendedorTipo_TipoVendedor] PRIMARY KEY CLUSTERED ([IdVendedor] ASC, [IdTipoVendedor] ASC)
);

Contexto gerado do DbContext:

public virtual DbSet<Vendedor> Vendedor { get; set; }
public virtual DbSet<TipoVendedor> TipoVendedor { get; set; }
public virtual DbSet<VendedorTipo> VendedorTipo { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    modelBuilder.Entity<Vendedor>(entity =>
        {
            entity.HasKey(e => e.IdVendedor);

            entity.Property(e => e.Alteracao).HasColumnType("datetime");

            entity.Property(e => e.CpfCnpj)
                .IsRequired()
                .HasMaxLength(15);

            entity.Property(e => e.Inclusao).HasColumnType("datetime");

            entity.Property(e => e.Nome)
                .IsRequired()
                .HasMaxLength(250);

            entity.Property(e => e.NomeRazao)
                .IsRequired()
                .HasMaxLength(250);

            entity.Property(e => e.Obs).HasMaxLength(250);

            entity.Property(e => e.RgIe).HasMaxLength(30);

            entity.Property(e => e.Url).HasMaxLength(250);

            entity.HasOne(d => d.IdUsuarioIncNavigation)
                .WithMany(p => p.Vendedor)
                .HasForeignKey(d => d.IdUsuarioInc)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Vendedor_Usuario");
        });

    modelBuilder.Entity<TipoVendedor>(entity =>
        {
            entity.HasKey(e => e.IdTipoVendedor);

            entity.Property(e => e.Descricao)
                .IsRequired()
                .HasMaxLength(250)
                .IsUnicode(false);

            entity.Property(e => e.Nome)
                .IsRequired()
                .HasMaxLength(50)
                .IsUnicode(false);
        });

    modelBuilder.Entity<VendedorTipo>(entity =>
        {
            entity.HasKey(e => new { e.IdVendedor, e.IdTipoVendedor });

            entity.Property(e => e.Inativo).HasColumnType("datetime");

            entity.Property(e => e.Inclusao).HasColumnType("datetime");
        });
}

Tem outras entidades e mapeamentos, mas solucionando essa dúvida creio que consigo fazer para as outras, a forma que tá foi o entity que fez pra mim e o banco foi feito dessa forma pela regra de negócio da empresa. Qualquer dúvida me pergunta.

Agradeço quem puder ajudar, valeu!