Итак, я работаю над 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);
}*/
}
}
Я использовал конфигурацию в качестве конструктора, но имел ошибку, поэтому пустая конфигурация рендеринга бесполезна.
Обратите внимание, что дыра проект довольно большой, и я не создавал его с самого начала, я уже сделал его на полпути.