none
desarrollar web api mvc6 para un servicio REST con MySQL o PostgreSQL RRS feed

  • Pregunta

  • Muy buenas, tengo interes en desarrollar una REST API con asp.net mvc6 por el tema de que funciona en linux un servidor y lanzar aplicaciones asp.net, estoy mirando este tutorial y he mirado otros este por ej esta muy bien

    http://www.asp.net/vnext/overview/aspnet-vnext/create-a-web-api-with-mvc-6

    pero no explica como conectar a una base de datos por ej MySQL o PostgreSQL porque mi interes es usar alguna de esas para crear mi REST, alguien me puede decir como utilizar el entity framework de mysql por ej, saludos.

    miércoles, 7 de enero de 2015 20:18

Respuestas

  • hola

    es dificil que encuentres tutoriales que planteen estos ejemplso con mysql o algun otro tipo de base de datos, porque basicamente es lo mismo, solo necesitas del proveedor de entity framework para esa base de datos y eso es toda la diferencia

    Entity Framework 6 with MySql

    recuerda que lo principal es instalar el conector de mysql para .net

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta onzulinapps viernes, 9 de enero de 2015 9:54
    jueves, 8 de enero de 2015 1:35
  • Que no hace falta crear tú mismo el JSON, ni crear un JSON result. Que lo hace solito la infraestructura de ASP.NET Web Api.

    Mira este código:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    
    namespace WebApiApplication.Controllers
    {
    
        public class Usuario
        {
            public int Id { get; set;}
            public string Nombre { get; set;}
        }
        public class TestController : ApiController
        {
            [HttpGet]
            public List<Usuario> Index()
            {
                return new List<Usuario> {
                    new Usuario { Id=1, Nombre="Jesús"},
                    new Usuario { Id=2, Nombre="Pepe"}
                };
    
            }
    
        }
    }


    Cuando accedes a la url:  /api/test/index  te devuelve el siguiente JSON:

    [{"Id":1,"Nombre":"Jesús"},{"Id":2,"Nombre":"Pepe"}]

    Lo único que necesitas es esto en el web api controller y creo que ya es la tercera vez que te lo digo:

    [HttpGet]
    public List<Usuarios> index()
    {
       return = db.Usuarios.ToList();
            
    }

    ¿Me vas a hacer caso esta vez o vas a seguir intentando construir tú mismo el JSON?



    Jesús López


    EntityLite a lightweight, database first, micro orm


    • Editado Jesús López lunes, 19 de enero de 2015 13:27 x
    • Marcado como respuesta onzulinapps viernes, 23 de enero de 2015 13:14
    lunes, 19 de enero de 2015 13:24

Todas las respuestas

  • hola

    es dificil que encuentres tutoriales que planteen estos ejemplso con mysql o algun otro tipo de base de datos, porque basicamente es lo mismo, solo necesitas del proveedor de entity framework para esa base de datos y eso es toda la diferencia

    Entity Framework 6 with MySql

    recuerda que lo principal es instalar el conector de mysql para .net

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta onzulinapps viernes, 9 de enero de 2015 9:54
    jueves, 8 de enero de 2015 1:35
  • Pues si muchas gracias, me estoy iniciando ahora en el ASP.NET no me gusto el php, digo bueno pues aprovechamos que asp.net mvc6 se puede usar en linux sin problema para servidor y aprendo asp.net y estoy liando creando una API REST, intente usar windowsazure como decia que se podia usar 10 servicios moviles por ej pues me anime pero luego intente crear otro servicio movil para ver el ejemplo de Microsoft y me dio problemas y lo voy a hacer a mano.
    viernes, 9 de enero de 2015 9:56
  • Muy buenas estoy intentando montar la API REST ya la publicare en github libre la estoy desarrollando con Visual Studio 2013 Comunity Edition y luego la portare a mvc6, estoy entre estos documentos.

    http://lvasquez.github.io/2014/11/18/EntityFramework-MySql/

    aqui no entiendo lo del nombre de la tabla y el tipo de columna porque quiero usarlo pero ¿como lo uso?, lo veo interesante estoy investigando como usarlo debe estar en la libreria eso.

    http://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html

    esto para conseguir la conexion pero vamos donde tengo laduda es como definir el atributo de una columna de la tabla y como definir el nombre de la tabla, saludos.

    martes, 13 de enero de 2015 11:29
  • El Entity Framewrok no es lo único que puedes usar para MySQL o PostgreSQL, EntityLite soporta los dos de serie.

    Además te digo una cosa, con EntityLite escribirás mucho menos código ya que puedes devolver las entidades directamente desde el Web Api sin tener que crear montones de DTO's.

    Y por otra parte EntityLite es mucho más eficiente que Entity Framework,  en consultas simples y complejas, en inserción y en actualización.



    Jesús López


    EntityLite a lightweight, database first, micro orm


    martes, 13 de enero de 2015 12:19
  • Buenas tardes Jesus Lopez, pues mirare el EntityLite, algo que no me gusta de desarrollar para tecnologias Microsoft es que lo ponen especialmente dificil el desarrollo en otras tecnologias como usat MySQL o PostGreSQL, en concreto ahora mismo estoy intentando usar MySQL con este tutorial que no saco nada en claro pq no funciona uno que encontre buscando.

    lo tengo tal cual aqui vamos yo creo que segun el ejemplo este el mio deberia funcionar.

    http://www.ryadel.com/2014/10/20/asp-net-setup-mvc5-website-mysql-entity-framework-6-code-first-vs2013/

    el mio lo tengo aqui en mi onedrive

    https://onedrive.live.com/redir?resid=E7A1E2FE2AB9BA9C!38306&authkey=!AOQtKimVqmBUF8A&ithint=file%2crar

    el tema es que no consigo utilizar labase de datos MySQL probare con lo que tu me dices a ver si tengo mas suerte, en principio lo que mas me hace falta es montar un servicio REST y luego ya ire desarrollando webs, saludos.

    miércoles, 14 de enero de 2015 12:11
  • onzulinapps,

    Tampoco es que sea tan directo usar EntityLite con MySQL como con SQL Server, la razón es que el proveedor ADO.NET de SQL Server está registrado en el machine.config y las clases de acceso a SQL Server están en la GAC en el ensamblado System.Data.dll. Mientras que con MySQL tienes que descargarte el conector de MySQL e instalar tú mismo ensamblado en la GAC además de modificar a mano el machine.config. Esto sólo es necesario hacerlo en el equipo de desarrollo, en producción o en testing, no es necesario, pero hay que hacer otras cosas.

    De todas maneras, estás de suerte, porque si hay alguien que puede hacer funcionar EntityLite con MySQL ese es el autor de EntityLite, que por cierto soy yo.

    Además como acabo de estrenar equipo no tengo nada configurado para usar EntityLite con MySQL. Pero sí tengo instalado MariaDB (el fork open source de MySQL). Así que ahora mismo voy a hacerlo funcionar con la base de datos de ejemplo Sakila que ya la tengo instalada.

    Mientras lo configuro todo y voy documentando los pasos ¿Qué tal si te vas leyendo el artículo de CodeProject introductorio de EntityLite y viendo el videoEmpezando Con EntityLite?



    Jesús López


    EntityLite a lightweight, database first, micro orm


    miércoles, 14 de enero de 2015 15:22
  • hola

    >>el tema es que no consigo utilizar labase de datos MySQL

    pero si con EF cambias el provider y eso es todo

    lo que si usas EF code First, no uses diagramas visuales porque para elli debes integrar la db al VS y alli puede haber algun que otro problema dependiendo de la version

    si defiens tu mapping desde codigo con Code First es directo

     Chapter 10 EF 6 Support

    lo que seguro vas a tener que usar es

     MySql.Data.Entity

    el paquete de nuget que le da soporte a EF6

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 14 de enero de 2015 16:27
  • Yo ya tengo un WebApi devolviendo un JSON con los actores de la base de datos Sakila:

        public class ActorsController : BaseController
        {
            public IHttpActionResult Get()
            {
                return Ok(this.DataService.ActorRepository.Query(Projection.BaseTable).ToList());
            }
            
        }

    Aquí tengo documentados todos los pasos hasta llegar a que esto funcione:

    Sakila.docx



    Jesús López


    EntityLite a lightweight, database first, micro orm

    miércoles, 14 de enero de 2015 17:47
  • MUy buenas, en realidad lo que he  hecho es coger el ejemplo de ryadel y he hecho muchos cambios para adaptarlo a mi bnase de datos pero en esencia esta mas o menos parecido aun asi no me funciona, el ejemplo que funciona perfectamente es este

    http://www.c-sharpcorner.com/uploadfile/raj1979/crud-operations-in-mvc-5-using-webapi-with-angularjs/

    Me gustaria saber ¿porque? a mi siempre me da fallo y no conecta con a base de datos ni la crea ni nada, ahora me he puesto a trabajar por defecto con SQL Server LocalDB y veo que tampoco tira, saludos.

    jueves, 15 de enero de 2015 13:11
  • Muy buenas, muchas gracias por la ayuda pero al menos parece que he conseguido desarrollar para que funcione lab ase de datos de la aplicacion web, ahora estoy intentando hacer el controlador para el servicio REST que es realmente lo que necesito y me he encontrado un problema que en php es muy facil de solucionar, se nota que C# es un lenguaje que hace las cosas diferentes y es algo mas complicado.

    public List<Usuarios> index()
            {
                //aqui recuperaremos los usuarios 
                
                List<Usuarios> usuarios = new List<Usuarios>();
                usuarios = db.Usuarios.ToList();
                
                string usuariosList = usuarios.ToString();
                JsonResult jsonResult = new JsonResult();
                jsonResult.Data = usuarios;
                return jsonResult(jsonResult.Data, JsonRequestBehavior.AllowGet);
                
                return usuarios;
                
            }

    En este metodo intento coger el objeto usuarios y lo que haya dentro lanzarlo en un json para que lo pueda ver el usuario en la misma web, ¿como lo puedo hacer?. saludos.
    viernes, 16 de enero de 2015 11:27
  • En principio sería esto, mucho más simple de lo que piensas.

    [HttpGet]
    public List<Usuarios> index()
            {
                return = db.Usuarios.ToList();
               
                
            }

    Otra cosa son los "rollos" de la Entity Framewok.  ¿Prueba esto y me dices si te da error de EF o no?

    La forma de trabajar con Web Api y Entity Framework es que en un método de web api  no deberías devolver entidades de Entity Framework, sino DTO's.

    Por qué?

    Pues por como funciona el Lazy Loading y el serializador JSON. Y porque muchas veces no quieres enviar la entidad entera con todas sus asociaciones y además "aplanarlas". 

    Así que ala, a crear DTO's a diestro y siniestro. Y si no, prueba EntityLite que ni tiene ni necesita Lazy Loading y donde las entidades ya son planas de por sí.



    Jesús López


    EntityLite a lightweight, database first, micro orm


    viernes, 16 de enero de 2015 11:36
  • Ok entendido vale pues ahora el problema que tengo e intento resolver es el siguiente mirando este documento sobre EF con SQL Server Local DB que es lo que usare hasta que  me funcione todo y entoces ya pasare a usar MySQL y me animare a usar Entity Lite para probarlo.

    http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

    En este documento explican como introducir datos con DbInicializer un objeto que ponemos con ese proposito pues lo estoy intentando hacer y no veo la manera el error que me da es si intento que borre la base de datos u la cree de nuevo no funciona, no veo la manera de hacerlo ¿porque me esta fallando? te puedo pasar el codigo para que tu mismo lo pruebes, saludos.

    viernes, 16 de enero de 2015 15:15
  • Pues sí, sería de ayuda que mostraras el código que estás usando y sobre todo el error exacto que te está dando con el call stack enterito si es posible porfa.

    Normalmente es muy difícil solucionar un problema si no único que sabes es que "no funciona".



    Jesús López


    EntityLite a lightweight, database first, micro orm



    viernes, 16 de enero de 2015 18:33
  • Hey acabo de subir el codigo de github para que lo veais y el problema que me esta dando es que no me añadia el usuario que se añade en el codigo de MyDbInitializer.cs no se inicializaba y ahora si, asi que ois voy a poner el codigo para que lo veais.

    Lo que tengo que hacer ahora en este codigo es mostrar el registro usando metodo GET en formato json, yo creo que ya con saber como se hace esto ya sabre trabajar con los demas, registros es basicamente trabajar con la base de datos.

    public List<Usuarios> index()
            {
                //aqui recuperaremos los usuarios
                
                List<Usuarios> usuarios = new List<Usuarios>();
                usuarios = db.Usuarios.ToList();
                
                string usuariosList = usuarios.ToString();
                JsonResult jsonResult = new JsonResult();
                jsonResult.Data = usuarios;
                //return jsonResult(jsonResult.Data, JsonRequestBehavior.AllowGet);
                
                return usuarios;
                
            }

    Aqui coloco el codigo del index() y ciertamente no se pq me ha funcionado y antes el error que me daba era error con la conexion de la base de datos y server version no se que, no entendi eso que me dijistes que no deberia trabajar devolviendo entidades de entity framework y si devolver DTO's, saludos.

    domingo, 18 de enero de 2015 23:23
  • ¿No estabas siguiendo el tutorial "Using Web Api With Entity Framework"

    En la parte 5 habla de crear DTO's:

    Create Data Transfer Objects (DTOs)

    ¿Cual es el repositorio de GitHub?



    Jesús López


    EntityLite a lightweight, database first, micro orm

    lunes, 19 de enero de 2015 7:19
  • Por cierto, ese código que has puesto hay unas cuantas cosas sin sentido. 

    1) Creas una lista de usuarios que luego no usas, porque luego la variable que la declara se la asignas a dbUsuarios.ToList();

    En vez de

    List<Usuarios> usuarios = new List<Usuarios>

    usuarios = db.Usuarios.ToList();

    Bastaría con:

    List<Usuarios> usuarios;

    usuarios = db.Usuarios.ToList();

    o mejor aún:

    var usuarios = db.Usuarios.ToList();

    La variable usuariosList no la usas tampoco

    Estas dos líneas tampoco sirven de nada:

    JsonResult jsonResult = new JsonResult();
    jsonResult.Data = usuarios;

    ya que la variable jsonResult no se usa después.

    En definitiva el método podría quedar así:

    public List<Usuarios> Index()
    {
       return db.Usuarios.ToList();
    }

    Que es justo lo que te puse en un post anterior.



    Jesús López


    EntityLite a lightweight, database first, micro orm


    lunes, 19 de enero de 2015 7:28
  • Ok eso me funciona, pero el problema que ahora yo lo tengo que enviar como json a los usuarios que hay y mostrarlos en la pagina web, en formato json se me ha ocurrido meterlos en un JArray estoy usando la libreria json.net mas o menos estoy cin este codigo y asi entendeis que necesito hacer. 

    List<Usuarios> usuarios = new List<Usuarios>();
    usuarios = db.Usuarios.ToList();
    
    for (int i = 0; i>= usuarios.Count ; i++)
                {
                    var usuario = usuarios.ElementAt(i);
                    string sUsuario = usuario.ToString();
                    JObject jObject = JObject.Parse(sUsuario);
                    JToken jArray_Item = jObject.Root;
                    JArray jArray = jArray_Item.
    
                    
                }

    lo que realmente me hace falta es mostrar todos esos usuarios que en realidad son filas de la base de datos en formato json.

    lunes, 19 de enero de 2015 13:02
  • Que no hace falta crear tú mismo el JSON, ni crear un JSON result. Que lo hace solito la infraestructura de ASP.NET Web Api.

    Mira este código:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    
    namespace WebApiApplication.Controllers
    {
    
        public class Usuario
        {
            public int Id { get; set;}
            public string Nombre { get; set;}
        }
        public class TestController : ApiController
        {
            [HttpGet]
            public List<Usuario> Index()
            {
                return new List<Usuario> {
                    new Usuario { Id=1, Nombre="Jesús"},
                    new Usuario { Id=2, Nombre="Pepe"}
                };
    
            }
    
        }
    }


    Cuando accedes a la url:  /api/test/index  te devuelve el siguiente JSON:

    [{"Id":1,"Nombre":"Jesús"},{"Id":2,"Nombre":"Pepe"}]

    Lo único que necesitas es esto en el web api controller y creo que ya es la tercera vez que te lo digo:

    [HttpGet]
    public List<Usuarios> index()
    {
       return = db.Usuarios.ToList();
            
    }

    ¿Me vas a hacer caso esta vez o vas a seguir intentando construir tú mismo el JSON?



    Jesús López


    EntityLite a lightweight, database first, micro orm


    • Editado Jesús López lunes, 19 de enero de 2015 13:27 x
    • Marcado como respuesta onzulinapps viernes, 23 de enero de 2015 13:14
    lunes, 19 de enero de 2015 13:24
  • Muy buenas ya me quedo claro el tema ese, la verdad vais a pensar que soy un pesado, ahora mismo estoy en la fase de ver porque no me funciona, cree otro proyecto instalo las librerias de web api 2.2, creo el proyecto con asp.net mvc5 y ya sabes que te crea un proyecto nuevo y asi he creado el proyecto, aqui lo tienes y no consigo que entre en el metodo index().

    https://github.com/onzulinapps/RestAPI

    el controlador lo podras encontrar aqui

    https://github.com/onzulinapps/RestAPI/blob/master/RestApi/Controllers/UsuariosController.cs

    y la carpeta de models

    https://github.com/onzulinapps/RestAPI/tree/master/RestApi/Models

    ahi estan las 3 tablas de mi modelo, Usuarios.cs, Actividades.cs y ActividadesAmigos.cs.

    PlanContext.cs es la clase que hace la conexion con la base de datos y MyDbInitializer.cs quien la inicializa, aunque he creado tambien migraciones en la carpeta Migrations, ahi tengo una duda que ahora leyendo a ver si la despejo.

    Lo que realmente me mosquea es que no consigo que funcione la API como tu me dijistes y creo que lo tengo hecho, de hecho tengo una aplicacion de ejemplo, en la que me he ido fijando para hacer el REST seria esta

    http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-1

    aqui si que entra si le das a debug, y depuras en los metodos

    localhost:puerto/api/books por ej y en el mio no entra en el metodo GET haciendo, localhost:puerto/api/usuarios ¿porque? he instalado esta web api 2.2 pero en mi aplicacion no entra, algo esta pasando esta claro, saludos.

    jueves, 22 de enero de 2015 11:12
  • Yo no veo que tengas un api controller que se llame usuarios. En realidad no he visto ningún api controller a parte de los que te crea la plantilla.

    Por cierto, personalmente no me gusta nada empezar una aplicación web usando otra plantilla que no sea la "Empty" porque si necesito algo ya lo añadiré no quiero que la App ya esté llena de cosas que no necesito o que las necesito de otra manera.

    Por otra parte, me gustaría ayudarte con Web Api y EntityLite, pero no tengo muchas ganas de hacerlo con Entity Framework.

    Además seguro que Leandro te puede ayudar mejor que yo con EF. Ya que él trabaja con EF. Yo no trabajo en proyectos reales con EF, yo uso EntityLite.



    Jesús López


    EntityLite a lightweight, database first, micro orm


    jueves, 22 de enero de 2015 14:01
  • >>me he encontrado un problema que en php es muy facil de solucionar, se nota que C# es un lenguaje que hace las cosas diferentes y es algo mas complicado.

    es que no tienen comparacion

    php podrias compararlo con asp.net, pero no con c#, igual sigo pensando que no puedes compararlo y menos aun si tu experiencia con el lenguaje es menor al otro, porque seguro tu sensacion sera todo ams dificil si desconoces sobre el mismo

    >>En este documento explican como introducir datos con DbInicializer un objeto que ponemos con ese proposito pues lo estoy intentando hacer y no veo la manera el error que me da es si intento que borre la base de datos u la cree de nuevo no funciona, no veo la manera de hacerlo ¿porque me esta fallando?

    pero estas mezclando todo, ve resolviendo de a parte sino sera una bola de probvlemas dificil de seguir

    cierra la construccion de los servicio de mvc devolviendo a lo sumo datos fake que tu crees despues te centras en el acceso a datos

    ademas no terminas de definir EF que quieres usar el DbInicializer, no lo definas no es obligatorio hacerlo

    alli plantea usar un SchoolInitializer para poner datos al crear la estructura de la db, pero no hace falta que lo realices en un principio

    ademas estas queriendo utilizar controladores para crear una view o quieres crear servicio REST con web api ? porque son cosas diferentes

    creo que primero deberias plantearte que quieres lograr, porque estas haciendo una mezcla de muchos temas

    ve atacandolos de a poco porque tu complejidad se da al abarcar mucho, crea tu sitio sin usar EF devuelve datos fijos a la view y valida que todo funcione

    despues cuando tengas eso estable acoplas EF con el acceso a la db que necesitas

    puedes abrir otro tema asi te ayudamos a implementar EF

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 22 de enero de 2015 14:25
  • Jesus gracias por recomendarme EntityLite pienso usarlo vamos, porque parece ayudar mucho, estoy mezclando pq la unica manera de aprender es esa ir mirando de muchos sitios e ir intentando hacer algo, de momento lo que necesito es una API REST una vez ya la monte y funcione, pienso montar webs en condiciones la API REST la necesito para consumirla desde aplicaciones moviles.

    Ademas tengo mas experiencia con C# que con php lo de php lo quise utilizar con laravel, para no complicarme la vida, pero lo he dejado completamente no me convencio nada como lenguaje y como asp.net es C# `pr debajo por eso me convence y ahora asp.net mvc6 tira perfectamente en Linux pues a usarlo.

    Bueno tengo que deciros que muchas gracias por todo si tengo algun problema que mas o menos los  he solucionado porque ahora en la API REST me da fallos pero creo que es por no crear bien la base de datos ya si eso abro otro hilo, saludos.

    viernes, 23 de enero de 2015 13:12
  • >>estoy mezclando pq la unica manera de aprender es esa ir mirando de muchos sitios e ir intentando hacer algo

    mezclar nunca ayuda, solo genera mas confusion

    ve atacando los temas de a partes, resuleve web api de forma correcta y como lo nacesitas, aunque sea devolviendo datos fijos en el codigo

    despues pasa a la integracion de la db usando EF pero te centrar en un solo tema, o es web api o es persistencia

    y cuando tengas los dos temas claros los integras, solo aplicas el dicho "divide y venceras", atacar todo junto es logico que no llegues a nada

    >>Ademas tengo mas experiencia con C# que con php lo de php lo quise utilizar con laravel, para no complicarme la vida

    no entiendo, si conoces mas c# porque no desarrollas en asp.net mvc, para que vas a php, eso es para complicarse

    la integracion entre asp.net mvc y las web api es mucho mas natural, que hacerlo con php

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 23 de enero de 2015 13:44