Usuário com melhor resposta
Problema com Model

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
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 exemploNa 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.
- Sugerido como Resposta Paulo M Dalbosco sexta-feira, 15 de fevereiro de 2013 02:02
- Marcado como Resposta welington jrModerator segunda-feira, 5 de março de 2018 11:57
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
-
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
-
-
-
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
-
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 exemploNa 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.
- Sugerido como Resposta Paulo M Dalbosco sexta-feira, 15 de fevereiro de 2013 02:02
- Marcado como Resposta welington jrModerator segunda-feira, 5 de março de 2018 11:57