Как настроить миграцию с использованием репозиториев без ключа с помощью метода HasNoKey ()? - PullRequest
0 голосов
/ 06 мая 2020

Итак, я работаю над API, который соединяется с двумя базами данных с разными контекстами БД, одна (IdentityContexto) уже работает, а другая (EtraducaoContexto) нуждается в репозиториях, имеющих контекст БД. Пока все хорошо, но когда я пытаюсь добавить миграцию для EtraducaoContexto, появляется ошибка, в которой говорится, что The entity type 'ControleDeValoresRepositorio' requires a primary key to be defined. If you intended to use a keyless entity type call 'HasNoKey()'. ControleDeValoresRepositorio является одним из репозиториев, и вот его код:

using System.Threading.Tasks;
using YellowLingAPI.Models.Entidades;
using YellowLingAPI.Models.Interfaces;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;


namespace YellowLingAPI.Data.Repositorio
{

    public class ControleDeValoresRepositorio : IControleDeValorRepositorio //controla o repostiro do banco de dados dos valores
    {
        private readonly EtraducaoContexto contexto;

        public ControleDeValoresRepositorio(EtraducaoContexto contexto)
        {

            this.contexto = contexto;

        }

        public async Task<decimal> BuscarControleDeValor(int id) //busca o valor dependendo do controle de valores
        {    
            ControleDeValores controle = await contexto.ControleDeValores.FirstOrDefaultAsync(x =>(x.Id.Equals(id)));
            var valor =controle.ValorFixo;
            return valor;
        }

        public async Task<decimal> BuscarControleDeValorTipo(string tipo) //busca o valor dependendo do controle de valores
        {
           ControleDeValores controle = await contexto.ControleDeValores.FirstOrDefaultAsync(x =>(x.TipoValor.Equals(tipo)));

            var valor = controle.ValorFixo;
            return valor;

        }

        public async Task Atualizar(ControleDeValores controle)
        {
            contexto.Update(controle);
            await contexto.SaveChangesAsync();
        }

        public async Task Adicionar(ControleDeValores controle)
        {
            await contexto.AddAsync(controle);
            await contexto.SaveChangesAsync();
        }
    }
}

Я попытался обновить до 5.0 .0 -предварительный просмотр EntityFrameWorkCore.Tools для использования аннотации к данным [Keyless], это вызывает ошибку совместимости с другими установленными пакетами, поэтому мне приходится использовать метод HasNoKey (), но я не могу понять, где мне нужно используйте этот метод, форумы показали, что он используется в контексте Db на ModelCreating, но поскольку это репозиторий, он там не объявляется, а контекст передается репозиторию. так что я не понимаю, что делать. Вот код EtraducaoContexto:

using System;
using YellowLingAPI.Models.Entidades;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

namespace YellowLingAPI.Data
{
    public class EtraducaoContexto : DbContext    //modelo da database
    {
        private readonly IConfiguration configuration;

        public EtraducaoContexto(DbContextOptions<EtraducaoContexto> options)
            : base(options)//IConfiguration configuration
        {
            //this.configuration = configuration;
          //  this.Database.SetCommandTimeout(100);
        }

          public DbSet<Cliente> Cliente { get; set; }

          public DbSet<ControleDeValores> ControleDeValores { get; set; }

          public DbSet<Documento> Documento { get; set; }

          public DbSet<Pagamento> Pagamento { get; set; }

          public DbSet<Solicitacao> Solicitacao { get; set; }

          public DbSet<Tradutor> Tradutor { get; set; }

          public DbSet <Config> Config { get; set; } //

          public DbSet <Idiomas> Idiomas { get; set; }//


          protected override void OnModelCreating(ModelBuilder modelBuilder)
          {
              base.OnModelCreating(modelBuilder);

              modelBuilder.Entity<ControleDeValores>().Ignore(x => x.CoefDeadline);
              modelBuilder.Entity<ControleDeValores>().Ignore(x => x.CoefDatasDisponiveis);
              modelBuilder.Entity<ControleDeValores>().Ignore(x => x.DeadLineMinima);
              modelBuilder.Entity<ControleDeValores>().Ignore(x => x.DeadLineMaxima);
              modelBuilder.Entity<ControleDeValores>().Ignore(x => x.QuantidadeDeLaudas);
              modelBuilder.Entity<ControleDeValores>().Ignore(x => x.idiomas);
              modelBuilder.Entity<ControleDeValores>().Ignore(x => x.config);
              modelBuilder.Entity<ControleDeValores>().Ignore(x => x.controlerepositorio);




              modelBuilder.Entity<ControleDeValores>().Ignore(x => x.idiomas);

              modelBuilder.Entity<Cliente>().OwnsOne(x => x.Cnpj)
                  .Property(x => x.Codigo)
                  .HasColumnName("Cnpj");

              modelBuilder.Entity<Cliente>()
                  .HasIndex(x => x.Email)
                  .HasName("Unique Email")
                  .IsUnique();

              modelBuilder.Entity<Cliente>().OwnsOne(x => x.Cpf)
                  .Property(x => x.Codigo)
                  .HasColumnName("Cpf");

              modelBuilder.Entity<Pagamento>().HasOne(x => x.Solicitacao)
                  .WithOne(x => x.Pagamento)
                  .HasForeignKey<Pagamento>(x => x.SolicitacaoId);

              modelBuilder.Entity <Solicitacao>().HasOne(x => x.Tradutor)
                  .WithMany(x => x.Solicitacoes)
                  .HasForeignKey(x => x.TradutorId);

              modelBuilder.Entity<Solicitacao>()
                  .Property(e => e.TipoDeSolicitacao)
                  .HasConversion(v => v.ToString(), v => (TiposDeSolicitacao)Enum.Parse(typeof(TiposDeSolicitacao), v));

              modelBuilder.Entity<Pagamento>()
                  .Property(e => e.FormaDePagamento)
                  .HasConversion(v => v.ToString(), v => (FormaDePagamento)Enum.Parse(typeof(FormaDePagamento), v));

              modelBuilder.Entity<Pagamento>()
                  .Property(e => e.StatusDePagamento)
                  .HasConversion(v => v.ToString(), v => (StatusDePagamento)Enum.Parse(typeof(StatusDePagamento), v));



          }

        /*  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
          {
            Database.SetCommandTimeout(100);
            optionsBuilder.UseSqlServer(configuration.GetConnectionString("EtraducaoContexto"));
              base.OnConfiguring(optionsBuilder);
          }*/
    }
    }

Я использовал конфигурацию в качестве конструктора, но имел ошибку, поэтому пустая конфигурация рендеринга бесполезна.

Обратите внимание, что дыра проект довольно большой, и я не создавал его с самого начала, я уже сделал его на полпути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...