none
Otro error en asp.net web api 2.2 ¿podeis ayudarme? RRS feed

  • Pregunta

  • https://github.com/onzulinapps/planningactivities/tree/master/RestAPIPlanningActivities/Models

    Antes me daba problemas la relacion AspNetUsers con Actividades fue cambiar el modelo de esta manera

    [Table("actividades", Schema = "dbo")]
        public class Actividades
        {
            [Key]
            [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
            public Int64 Id { get; set; }
            [MaxLength(100)]
            public string Nombre { get; set; }
            //ntext para SQL Server y text para MySQL
            //[Column("informacion", TypeName = "ntext")]
            [Column("Informacion", TypeName = "text")]
            public string Informacion { get; set; }
            [MaxLength(250)]
            public string Direccion { get; set; }
            public DateTime Horarioinicial { get; set; }
            public DateTime Horariofinal { get; set; }
            [MaxLength(250)]
            public string Latitud { get; set; }
            [MaxLength(250)]
            public string Longitud { get; set; }
            [MaxLength(250)]
            public string Altitud { get; set; }
            //precision = accurac
            [MaxLength(250)]
            public string Accuracy { get; set; }
            //[ForeignKey("UsuarioID")]
            public String UsuarioID { get; set; }
            public virtual AspNetUsers Usuario { get; set; }
            

    y ya ese no es el problema el problema es este otro:

    Se produjo una excepción de tipo 'System.InvalidOperationException' en EntityFramework.dll pero no se controló en el código del usuario

    Información adicional: No se admiten varios conjuntos de objetos por tipo. Los conjuntos de objetos 'AspNetUsers' y 'AspNetUserRoles' pueden contener instancias de tipo 'RestAPIPlanningActivities.Models.AspNetUsers'.

    la tabla esa la tengo aqui definida en el modelo de datos: 

    https://github.com/onzulinapps/planningactivities/blob/master/RestAPIPlanningActivities/Models/Actividades.cs

    Ahi esta la verdad es que no se que estara pasando si me podeis dar alguna indicacion, saludos.

    jueves, 6 de agosto de 2015 12:50

Respuestas

Todas las respuestas

  • hola

    de casualidad enviaas como respuestas del webapi una entidad Actividades ? porque puede que la recursividad al serializar genere el problema

    quizas deberias ver si puedes convertir la entidad a una donde puedas limitar la profundidad recursiva de los datos

    cuando usas EF por lazy recorre de forma indefinida

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 6 de agosto de 2015 13:37
  • La verdad es que no entiendo eso de la recursividad, que hablas necesito por lo que yo entiendo el error lo tengo entre la tabla AspNetUsers y AspNetUserRoles, ¿puede ser que el problema este en la serializacion y deserializacion? si puedes y te apetece puedes descargarte el proyecto y probarlo, mi idea es que el proiyecto este, este publicado en esta direccion de github.

    Eso de EF por Lazy ¿que es?, saludos.

    viernes, 7 de agosto de 2015 10:01
  • hola

    >>¿puede ser que el problema este en la serializacion y deserializacion?

    en realidad el problema es la serializacion, si una entidad se relaciona con otra y esta ultima a su ves tiene uan propiedad a la primera eso es recursividad, al serialziar eso trae problemas, por eso se suele generar una entidad separada que permita definir la profundidad de los datos que quieres enviar, basicamente seria aplanar los datos

    >>Eso de EF por Lazy ¿que es?,

    es la forma en que EF recupera los datos de la entidades asociadas, por defecto una propeidad que relaciona con otra no se carga en el momento sino cuando la accedes

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 7 de agosto de 2015 13:43
  • Ahhh pues vale he aprendido algo mas, ¿como tengo que hacer lo que necesito? ahora el error que me da es con la relacion AspNetUsers y AspNetUserRoles

    lo he puesto de esta manera lo tengo escrito en el codigo pero te lo pongo para que me guies un poco

     [Table("AspNetUserRoles", Schema = "public")]
        public class AspNetUserRoles
        {
            [Key]
            [MaxLength(128)]
            public string UserId { get; set; }
            //[ForeignKey("UserId")]
            public virtual AspNetUsers User { get; set; }
            [Key]
            [MaxLength(128)]
            public string RoleId { get; set; }
            //[ForeignKey("RoleId")]
            public virtual AspNetRoles Role { get; set; }
    
            
        }
    // esta la tabla AspNetUsers
     [Table("AspNetUsers", Schema = "dbo")]
        public class AspNetUsers
        {
            
            [Key]
            [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
            [MaxLength(128)]
            public string Id { get; set; }
            [MaxLength(256)]
            public string Email { get; set; }
            //este tipo de dato es boolean o bool puede fallar como boolean cuestion de probar
            [DataType("boolean")]
            public bool EmailConfirmed { get; set; }
            [MaxLength(250)]
            public string PasswordHash { get; set; }
            [MaxLength(500)]
            public string PhoneNumber { get; set; }
            [DataType("boolean")]
            public bool PhoneNumberConfirmed { get; set; }
            [DataType("boolean")]
            public bool TwoFactorEnabled { get; set; }
            //lo mismo hay que definir tipo de dato de fecha al usar PostgreSQL
            public DateTime? LockoutEndDateUtc { get; set; }
            [DataType("boolean")]
            public bool LockoutEnabled { get; set; }
            public int AccessFailedCount { get; set; }
            [MaxLength(256)]
            public string UserName { get; set; }
            
            [MaxLength(200)]
            public string Nombre { get; set; }
            [MaxLength(200)]
            public string Apellidos { get; set; }
            
            //campo confirmacion de email campo booleano a ver si MySQL lo coge asi y SQL Server
            //[Column("emailConfirmed", TypeName = "tinyint")]
            //en la programacion ya tengo en cuenta que este campo lo quiero para poner 0 en caso de False y 1 en caso de true
       
            //public DateTime created_at { get; set; }
            //public DateTime updated_at { get; set; }
            //define la propidad de navegacion
            public virtual ICollection<Actividades> Actividades { get; set; }
        }

    Ok y falla en como tengo el metodo construido cuando compilo veo que no recupera nada me da la sensacion como si no funcionara bien la base de datos o creada mal o alguna historia asi

    Se produjo una excepción de tipo 'System.InvalidOperationException' en EntityFramework.dll pero no se controló en el código del usuario

    Información adicional: No se admiten varios conjuntos de objetos por tipo. Los conjuntos de objetos 'AspNetUsers' y 'AspNetUserRoles' pueden contener instancias de tipo 'RestAPIPlanningActivities.Models.AspNetUsers'

     [HttpGet]
            public AspNetUsers Get(string id)
            {
    
                AspNetUsers usuario = db.AspNetUsers.FirstOrDefault(u => u.Email == id);
    
                return usuario;
    
            }

    estoy por realizar una prueba a ver como me crea la base de datos segun tengo el modelo de datos y si me lo crea en el momento que yo quiero y esas cosas ¿tu como lo ves? saludos.

    lunes, 10 de agosto de 2015 9:35
  • Bueno pues parece ser que haciendo la prueba tal cual tengo mi codigo de crear la base de datos utilizando SQL Server Local DB pues no me crea las tablas Actividades, ActividadesAmigos, Amigos, es posible que falle por eso, tambien si uso la parte de MVC si te das cuenta utilizo tambien MyDbContext a traves de la clase UserManager AplicationUserManager y todas estas, de todas maneras intento inicializar la base de datos y tengo un problema que es mas bien de EntityFramework que veo que como ORM esta bien, pero da muchojs problemas.

    Los problemas son los siguientes: 

    -Utilizo la web tal cual solo cambiando la linea de web.config para usar LocalDB de SQL Server para realizar las pruebas me crea la base de datos sin las tablas Amigos, Actividades y ActividadesAmigos.

    -borro la base de datos y intento crearla de nuevo pero no me la crea, entoces me salen varias dudas, ¿esta utilizando el MyDbInitializer que es una clase para inciializar la base de datos o ¿que esta usando? mira mi codigo y ejecuta la aplicacion a ver si sacas algo en claro.

    Por tanto no se que hacer a ver si me pudierasayudar gracias.

    martes, 11 de agosto de 2015 10:01
  • Pues yo creo que algo estoy haciendo mal solo me crea las tablas de la aplicacion en si que utilice para crear mi proyecto, queria aprovechar todo el codigo de mvc de varias aplicaciones que he visto para no complicarme la vida, y la verdad es que veo que me la he complicado de mas la vida, y me deberia crear las 3 tablas que faltan ¿podrias echarle un ojo al codigo y a ver que pasa que no me crea esas 3 tablas? saludos.
    martes, 11 de agosto de 2015 10:29
  • Ademas me ha creado la base de datos como me la creaba antes sin las tablas como yo necesito me podrias decir por favor ¿que esta pasando? porque sinceramente llevo meses con la web api y no me aclaro siguiendo tutoriales que lo unico que hacen es liarte mas y solo valen para no aprender y ,me estoy hartando de asp.net la verdad, saludos.
    martes, 11 de agosto de 2015 10:41
  • hola

    es que en realidad tu no deberias definir las entidades de usuario y roles, para eso ya lo debe realizar security de simplememebership

    creo que deberias leer sobre el tema

     

    Understanding and Using Simple Membership Provider in ASP.NET MVC 4.0

    la definicion de las entidades ya las tienes la libreria tu solo podrias extender esa funcionalidad

    >>No se admiten varios conjuntos de objetos por tipo. Los conjuntos de objetos 'AspNetUsers' y 'AspNetUserRoles' pueden contener instancias de tipo 'RestAPIPlanningActivities.Models.AspNetUsers'

    es justamente por lo que comento, el contexto de simplemembership ya existe, tu solo deberias extenderla si es que lo necesitas, pero nada mas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 11 de agosto de 2015 12:14
  • Hola, creo que el error que te sale se debe a que haz marcado una de las clases con el schema "public", cámbialo por dbo.

    Saludos,

    martes, 11 de agosto de 2015 14:17
  • Bueno no obstante deberia poder crear el modelo completo de la base de datos, con EntityFramework cuando la web se pone a funcionar, y  entra en MyDbContext ya perfectamente definida he visto que me general a base de datos solo las tablas AspNetUsers, AspNetUserRoles, AspNetUserClaims, AspNetUserLogins, y ademas yusando el esquema dbo, si os fijais en el codigo esta usando las tablas que cogi de un ejemplo y yo quiero añadir mas tablas si os dais cuenta Leandro, aparte de que intento usar Enable-Migrations y me da este error:

    PM> Enable-Migrations
    Enable-Migrations : El término 'Enable-Migrations' no se reconoce como nombre de un cmdlet, función, archivo de script o programa ejecutable. Compruebe si escribió correctamente el nombre 
    o, si incluyó una ruta de acceso, compruebe que dicha ruta es correcta e inténtelo de nuevo.
    En línea: 1 Carácter: 1
    + Enable-Migrations
    + ~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Enable-Migrations:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException
     
    PM> 

    jueves, 13 de agosto de 2015 9:35
  • En tu consola de NuGet estas seleccionando el proyecto apropiado que tiene instalados los paquetes de EntityFramework y demás? 

    Saludos

    jueves, 13 de agosto de 2015 17:47
  • Bueno yo con ayuda de un amigo al final consegui que la base de datos me la cree corectamente el proyecto como lo tengo ahora mas o menos esta aqui y me esta dando problemas ahora con crear usuarios con securitystamp con que no existe esa columna el proyecto lo tengo en:

    https://github.com/onzulinapps/WebPlanningActivities

    es el mismo proyecto solo que creo que la base de datos esta arreglada y ahora mesalta con ese problema, he probado a crearla la DB en SQL Server Express pero estoy probando a usar la app en PostgreSQL que es donde finalmente desplegare mi aplicacion aqui teneis los detalles del error. 

    Saludos.

    Error de servidor en la aplicación '/'.
    ERROR: 42703: no existe la columna Extent1.SecurityStamp
    Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código.
    
    Detalles de la excepción: Npgsql.NpgsqlException: ERROR: 42703: no existe la columna Extent1.SecurityStamp
    
    Error de código fuente:
    
    
    Línea 186:                var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
    Línea 187:                
    Línea 188:                var result = await UserManager.CreateAsync(user, model.Password);
    Línea 189:                
    Línea 190:                if (result.Succeeded)
    
    
    Archivo de origen: K:\Desarrollo de aplicaciones\web asp.net mvc\WebPlanningActivities\RestAPIPlanningActivities\Controllers\AccountController.cs    Línea: 188
    
    Seguimiento de la pila:
    
    
    [NpgsqlException (0x80004005): ERROR: 42703: no existe la columna Extent1.SecurityStamp]
       Npgsql.<ProcessBackendResponses>d__0.MoveNext() +418
       Npgsql.ForwardsOnlyDataReader.GetNextResponseObject(Boolean cleanup) +479
       Npgsql.ForwardsOnlyDataReader.GetNextRowDescription() +79
       Npgsql.ForwardsOnlyDataReader.NextResultInternal() +63
       Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean preparedStatement, NpgsqlRowDescription rowDescription) +138
       Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) +317
       Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb) +178
       Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +4
       System.Data.Common.DbCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) +176
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       System.Data.Entity.Core.EntityClient.Internal.<ExecuteStoreCommandsAsync>d__c.MoveNext() +250
    
    [EntityCommandExecutionException: Error al ejecutar la definición del comando. Vea la excepción interna para obtener detalles.]
       System.Data.Entity.Core.EntityClient.Internal.<ExecuteStoreCommandsAsync>d__c.MoveNext() +340
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       System.Data.Entity.Core.Objects.Internal.<ExecuteAsync>d__0`1.MoveNext() +1496
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       System.Data.Entity.Utilities.CultureAwaiter`1.GetResult() +59
       System.Data.Entity.Core.Objects.<ExecuteInTransactionAsync>d__3d`1.MoveNext() +866
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       System.Data.Entity.Utilities.CultureAwaiter`1.GetResult() +59
       System.Data.Entity.Core.Objects.<GetResultsAsync>d__e.MoveNext() +643
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       System.Data.Entity.Utilities.CultureAwaiter`1.GetResult() +59
       System.Data.Entity.Internal.<FirstMoveNextAsync>d__0.MoveNext() +264
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       System.Data.Entity.Infrastructure.<FirstOrDefaultAsync>d__25`1.MoveNext() +350
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       Microsoft.AspNet.Identity.<ValidateUserName>d__4.MoveNext() +521
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       Microsoft.AspNet.Identity.<ValidateAsync>d__0.MoveNext() +247
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       Microsoft.AspNet.Identity.<CreateAsync>d__0.MoveNext() +568
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       Microsoft.AspNet.Identity.<CreateAsync>d__d.MoveNext() +483
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +28
       RestAPIPlanningActivities.Controllers.<Register>d__17.MoveNext() in K:\Desarrollo de aplicaciones\web asp.net mvc\WebPlanningActivities\RestAPIPlanningActivities\Controllers\AccountController.cs:188
       System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
       System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
       System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +97
       System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) +17
       System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
       System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
       System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
       System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50
       System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225
       System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10
       System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
       System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
       System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
       System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26
       System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
       System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
       System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
       System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
       System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
       System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
       System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
       System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36
       System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12
       System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
       System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
       System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
       System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
       System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
       System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
       System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
       System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
       System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9723757
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
    
    
    Información de versión: Versión de Microsoft .NET Framework:4.0.30319; Versión ASP.NET:4.6.79.0 

    viernes, 14 de agosto de 2015 12:12
  • Hey una pregunta Leandro entoces una solucion podria ser como uso membership provider en mi codigo podria crear con el DbContext del membership las clases esas que empiezan por Asp tal cual y luego las otras 3 las creo con mi DbContext y si eso extiendo la clase que me interesa con el DbContext que en este caso es AspNetUsers ¿seria lo mas facil de hacer no? es que mira con el ingles no me llevo muy bien me cuesta mucho leerlo aunque intentare leer esa documentacion que me has pasado gracias.
    martes, 18 de agosto de 2015 9:57
  • Muy buenas tardes lo encontre el tutorial sobre el cual mi aplicacion digamos que coge toda esta aplicacion y la adapta en realidad estoy usando el sistema de asp.net mvc5 identify ni simplemembership ni membership, la hago desde este tutorial mi aplicacion por tanto tendre que leer sobre lo que me dijistes de extender la funcionalidad del identify aqui tengo el tutorial sobre le que he hecho mi web api 2.2 y me servicio MVC 

    http://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-web-app-with-email-confirmation-and-password-reset

    Utilizando de base de datos PostgreSQL que basicamente es cambiar la cadena de conexion  y poco mas, saludos 

    miércoles, 26 de agosto de 2015 10:36