erro CS0311 Não há conversão de referência implícita

8 respostas
classesaspnetherançaerror
C

Aparece o seguinte erro , já tentei procurar no google mas não achei , se alguém puder ajudar segue o código…

using Dominio.Repositorio;

using Microsoft.EntityFrameworkCore;

using Repositorio.Contexto;

using Repositorio.Interfaces;

using SistemaVenda.Dominio.Entidades;

using System;

using System.Collections.Generic;

using System.Text;

namespace Repositorio.Entidades

{

public class RepositorioCategoria : Repositorio, IRepositorioCategoria

{

public RepositorioCategoria(ApplicationDbContext dbContext) : base(dbContext) { }

}

}

//o erro aparece no RepositorioCategoria em pontinhos

codigo da classe EntityBase

using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text;

namespace SistemaVenda.Dominio.Entidades { public class EntityBase
{
[Key]
public int? Codigo { get; set; }

}

}

namespace Dominio { public class EntityBase { public int Codigo; } }

Codigo da classe Categoria

using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks;

namespace SistemaVenda.Dominio.Entidades { public class Categoria : EntityBase {
public string Descricao { get; set; }

public ICollection<Produto> Produtos { get; set; }

}

}

Gravidade Código Descrição Projeto Arquivo Linha Estado de Supressão

Erro CS0311 O tipo “SistemaVenda.Dominio.Entidades.Categoria” não pode ser usado como parâmetro de tipo “TEntidade” no tipo ou método genérico “Repositorio”. Não há conversão de referência implícita de “SistemaVenda.Dominio.Entidades.Categoria” em “Dominio.EntityBase”.

8 Respostas

G

Boa noite, algumas partes do codigo ficaram no padrão certo e outras não, ficou um pouco dificil de entende-lo…

Mas, você pode postar sua classe Repositorio (essa que RepositorioCategoria herda) ?

C

Oi obrigada, pois é…achei que o erro de repente vem da classe EntityBase que a classe Categoria está tendo dificuldade de puxar…mas esqueci de postar o código …aí segue

using Dominio;
using Dominio.Interfaces;
using Microsoft.EntityFrameworkCore;
using Repositorio.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;



namespace Repositorio
{
    public abstract class Repositorio<TEntidade> : DbContext, IRepositorio<TEntidade> //
        where TEntidade : EntityBase, new()

    {
       DbContext Db;
       public  DbSet<TEntidade> DbSetContext;//protected

        public Repositorio(DbContext dbcontext)
        {
            Db = dbcontext;
            DbSetContext = Db.Set<TEntidade>();


        }


        public void Create(TEntidade Entity)
        {
         if(Entity.Codigo==null)
            { DbSetContext.Add(Entity);                 }

            else
            {Db.Entry(Entity).State = EntityState.Modified; }

            SaveChanges();

        }

        public virtual void Delete(int id)
        {
            var ent = new TEntidade() { Codigo = id };
            DbSetContext.Attach(ent);
            DbSetContext.Remove(ent);
            Db.SaveChanges();
            
        }

        public TEntidade Read(int id)
        {
            return DbSetContext.Where(x => x.Codigo == id).FirstOrDefault();
        }

        public virtual IEnumerable<TEntidade> Read()
        {
            return DbSetContext.AsNoTracking().ToList();
      
        
 
      }
    }

    //
}
G
public abstract class Repositorio : DbContext, IRepositorio //
where TEntidade : EntityBase

Seu problema está aqui.
1º ponto: você não deve herdar o DbContext e sim receber uma instancia dele.
2º ponto: você não disse que seu repositório é uma classe genérica.

Ajustando isso, ficaria assim:

public abstract class Repositorio<TEntidade> : IRepositorio<TEntidade> where TEntidade : EntityBase
C

obrigada pela dica, tentei aqui…não deu certo de primeira…acho que de repente eu teria que alterar o codigo abaixo

{
   DbContext Db;
   public  DbSet<TEntidade> DbSetContext;//protected

    public Repositorio(DbContext dbcontext)
    {
        Db = dbcontext;
        DbSetContext = Db.Set<TEntidade>();


    }


    public void Create(TEntidade Entity)
    {
     if(Entity.Codigo==null)
        { DbSetContext.Add(Entity);                 }

        else
        {Db.Entry(Entity).State = EntityState.Modified; }

        SaveChanges();

    }

estou começando nesse tipo de linguagem…acho que pode ser isso

G

Aparentemente está certo. Consegue mandar um print da lista de erros do VisualStudio?

C

oi…é uma lista de muitos erros…eu acho que todos estão sendo puxados por esse erro…mandando um print dos erros que colar aqui não vai :grimacing:

G

Me parece que você tem vários namespaces diferentes que contém a mesma classe.

Nas suas entidades, você está referenciando a classe EntityBase do namespace SistemaVenda.Dominio.Entidades e nos repositorios você procura por uma classe EntityBase que está no namespace Dominio.
Embora aparentemente elas tenham a mesma implementação, ainda são diferentes. Padronize isso, ou use de um lugar ou use de outro.

Alguns desses erros, são erros de sintaxe. Você terá de analisar o código e ver se consegue descobrir o que errou.

C

Valeu…foi tentar opções aqui …:slightly_smiling_face:

Criado 17 de abril de 2020
Ultima resposta 23 de abr. de 2020
Respostas 8
Participantes 2