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!