none
Problema com Model RRS feed

  • Pergunta

  • Olá pessoal,

    estou desenvolvendo um projeto em camadas utilizando MVC 3.0 e ADO.Entity Data Model, tendo:

    projeto.Web (MVC)

    projeto.BLL

    projeto.DAL (ADO.Entity Data Model)

    Estou tentando carregar um dropdownlist na minha View, porém não consigo preencher a minha "tipoObraModel" (criada no MODEL do MVC com as mesmas propriedades da entidade), para passar pra View, isso ocorre quando tento pegar a lista da minha entidade.

    //Classe da BLL que herda os métodos da DAL
    TipoObraBo tipoObra = new TipoObraBo();
    //Classe Model
    TipoObraModel tipoObraModel = new TipoObraModel();
    //Adiciona a lista do banco no Model
    List<tipoObraModel> = tipoObra.GetAll().ToList();


    Descrição do Erro:

    Cannot implicitly convert type 'System.Collection.Generic.List<ArtDecorDal.tb_tpobra>' to 'System.Collection.Generic.List <ArtDecorWeb.Models.TipoObraModel>

     Peço ajuda!

    Obrigado


    • Editado Phellipe_M sexta-feira, 1 de fevereiro de 2013 14:46
    sexta-feira, 1 de fevereiro de 2013 14:45

Respostas

  • Murilo,
    achei uma solução para esse problema...

    Como o Entity Data Model trabalha com "Partial Class" para suas entidades, eu criei uma classe partial com o mesmo nome da entidade. 
    Depois herdei de uma Interface do objeto suas propriedades (lembrando que as propriedades devem ter o mesmo nome das propriedades da entidade) e depois coloquei dentro da MODEL dos meus objetos os métodos construtores... E funcionou... segue o exemplo

    Na classlibrary.DATABASE (classe que foi adicionada como partial da entidade:

    namespace Projeto.Database
    {
        public partial class tpobra : ITipoObra
        {
        }
    }

    Na classlibrary.MODEL - INTERFACE (propriedades com os nomes iguais ao da entidade

    namespace Projeto.Model
    {
        public interface ITipoObra
        {
            int ID { get; set; }
            string NOME { get; set; }
        }
    }

    Na classlibrary.MODEL - Model (Método Construtor da propriedade)
    namespace Projeto.Model
    {
        public class TiposObrasModel
        {
            public List<ITipoObra> Lista { get; set; }
    
            public TiposObrasModel()
            {
            }
    
            public TiposObrasModel(List<ITipoObra> listTipos)
            {
                Lista = listTipos;
            }
        }
    }

    Na classlibrary.DATALAYER (faz a busca no banco)
            public List<ITipoObra> GetTipos()
            {
    
                List<ITipoObra> listaTipos = new List<ITipoObra>();
    
                var query = from t in entities.tpobra select t;
    
                foreach (var item in query.ToList())
                {
                    listaTipos.Add(item);    
                }
    
                return listaTipos;
    
            }

    Na classlibrary.CLIENT (Passando para o metodo construtor do objeto suas propriedades)
            public TiposObrasModel GetTiposObra()
            {
                ObrasDatalayer obras = new ObrasDatalayer();
                TiposObrasModel tipos = new TiposObrasModel(obras.GetTipos());
    
                return tipos;
            }

    Agora foi simples... Só chamei no Controller do projeto.Web e funcionou!

    Obrigado.

    sexta-feira, 15 de fevereiro de 2013 00:27

Todas as Respostas

  • Você está tentando atribuir um List<tb_tpobra> a um List <TipoObraModel>.. isso não vai funcionar a menos que você crie uma conversão implicita de tb_tpobra para TipoObraModel na classe tb_tpobra.

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    sexta-feira, 1 de fevereiro de 2013 15:01
  • Certo... mas como ficaria isso? O ADO.Entity Data Model gerou esse código:

            public ObjectSet<tb_obras> tb_obras
            {
                get
                {
                    if ((_tb_obras == null))
                    {
                        _tb_obras = base.CreateObjectSet<tb_obras>("tb_obras");
                    }
                    return _tb_obras;
                }
            }
            private ObjectSet<tb_obras> _tb_obras;

    Obrigado

    sexta-feira, 1 de fevereiro de 2013 15:40
  • Esse código está certo, o problema está na sua atribuição.. tenta isso:

    var tipos = tipoObra.GetAll().ToList();


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    sexta-feira, 1 de fevereiro de 2013 16:01
  • Mas eu não preciso passar assa lista de valores pra uma Model, para enviar pra View?
    sexta-feira, 1 de fevereiro de 2013 16:25
  • Sim, mas isso não é feito automaticamente.. você mesmo deve mapear as propriedades ou usar alguma biblioteca para isso..

    Fazendo isso:

    ViewModel viewmodel = tipoObra.GetAll();

    não vai funcionar.

    você precisa fazer algo assim:

    var tipos = tipoObra.GetAll();
    
    ViewModel viewmodel = new ViewModel();
    viewmodel.Tipos = ConvertToTypeViewModel(tipos);//aqui você converte uma entity para um viewmodel

    você pode dar uma pesquisada em alguma biblioteca para fazer isso.. eu uso o AutoMapper:

    https://github.com/AutoMapper/AutoMapper/wiki/Getting-started


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    sexta-feira, 1 de fevereiro de 2013 16:31
  • Murilo,
    achei uma solução para esse problema...

    Como o Entity Data Model trabalha com "Partial Class" para suas entidades, eu criei uma classe partial com o mesmo nome da entidade. 
    Depois herdei de uma Interface do objeto suas propriedades (lembrando que as propriedades devem ter o mesmo nome das propriedades da entidade) e depois coloquei dentro da MODEL dos meus objetos os métodos construtores... E funcionou... segue o exemplo

    Na classlibrary.DATABASE (classe que foi adicionada como partial da entidade:

    namespace Projeto.Database
    {
        public partial class tpobra : ITipoObra
        {
        }
    }

    Na classlibrary.MODEL - INTERFACE (propriedades com os nomes iguais ao da entidade

    namespace Projeto.Model
    {
        public interface ITipoObra
        {
            int ID { get; set; }
            string NOME { get; set; }
        }
    }

    Na classlibrary.MODEL - Model (Método Construtor da propriedade)
    namespace Projeto.Model
    {
        public class TiposObrasModel
        {
            public List<ITipoObra> Lista { get; set; }
    
            public TiposObrasModel()
            {
            }
    
            public TiposObrasModel(List<ITipoObra> listTipos)
            {
                Lista = listTipos;
            }
        }
    }

    Na classlibrary.DATALAYER (faz a busca no banco)
            public List<ITipoObra> GetTipos()
            {
    
                List<ITipoObra> listaTipos = new List<ITipoObra>();
    
                var query = from t in entities.tpobra select t;
    
                foreach (var item in query.ToList())
                {
                    listaTipos.Add(item);    
                }
    
                return listaTipos;
    
            }

    Na classlibrary.CLIENT (Passando para o metodo construtor do objeto suas propriedades)
            public TiposObrasModel GetTiposObra()
            {
                ObrasDatalayer obras = new ObrasDatalayer();
                TiposObrasModel tipos = new TiposObrasModel(obras.GetTipos());
    
                return tipos;
            }

    Agora foi simples... Só chamei no Controller do projeto.Web e funcionou!

    Obrigado.

    sexta-feira, 15 de fevereiro de 2013 00:27