none
No consigo hacer la busqueda por id que en mi caso el id es un email RRS feed

  • Pregunta

  • Muy buenas tengo el codigo de mi web api aqui

    https://github.com/onzulinapps/planningactivities/blob/master/RestAPIPlanningActivities/Controllers/UsuariosRestController.cs

    Quiero realizar una busqueda por el id que en mi caso es el email para que me devuelva el id al que pertenece ese email, ¿como lo hago? me esta dando errores por todos lados si intento hacer esto

    [HttpGet]
            public IEnumerable<AspNetUsers> get(string id)
            {
                db.Database.Connection.Open();
                
    
                //AspNetUsers usuario = db.AspNetUsers.Find(id);
                IEnumerable<AspNetUsers> usuarios = db.AspNetUsers.ToList(); 
                IEnumerable<AspNetUsers> usuario = usuarios.Where<AspNetUsers>(mail => mail.Email == id);
    
                return usuario;
                
            }


    me suelta el error de el metodo db.AspNetUsers.ToList();

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

    Información adicional: No se puede establecer la propiedad 'LockoutEndDateUtc' de 'AspNetUsers' en un valor 'null'. Debe establecer esta propiedad en un valor que no sea NULL de tipo 'System.DateTime'.

    Si lo intento hacer con el otro metodo que tal cual lo tengo en el codigo que muestro me da null en el objeto y no me es capaz de encontrar nada el metodo FindAsync()

      // GET: api/UsuariosRest/5
            [ResponseType(typeof(AspNetUsers))]
            public async Task<IHttpActionResult> GetUsuarios(string id)
            {
                db.Database.Connection.Open();
                AspNetUsers usuarios = await db.AspNetUsers.FindAsync(id);
                if (usuarios == null)
                {
                    return NotFound();
    
                }
    
                return Ok(usuarios);
    
            }
    

    Tal cual asi no me encuentra nada tambien he intentado hacerlo de esta otra manera como expongo en este codigo

    [ResponseType(typeof(AspNetUsers))]
            public async Task<IHttpActionResult> Get(string id)
            {
                db.Database.Connection.Open();
                AspNetUsers usuarios = new AspNetUsers();
                
                //sacar el listado de la tabla con todos los usuarios con su email y todos los campos y luego buscar por la cadena
                List<AspNetUsers> Users = db.AspNetUsers.ToList();
                IEnumerable<AspNetUsers> User = Users.Where(user => user.Email == id);
                //usuarios = await db.AspNetUsers.FindAsync(id);
                //AspNetUsers usuario = User.First();
                if (usuarios == null)
                {
                    return NotFound();
    
                }
    
                return Ok(usuarios.Id);
    
            }

    De esta manera no encuentra nada null en el objeto usuarios si lo pongo como lo he escrito tal cual no es capaz de sacarme la tabla para buscar los datos, ¿que esta pasando?

    Estoy usando lo de UserManager y demas para loguearmew y registrar usuarios no se si eso tiene algo que ver y la base de datos es PostgreSQL, pero con EntityFramework no deberia haber problema, saludos.

    martes, 28 de julio de 2015 12:23

Respuestas

  • he estado viendo tu código de GitHub y te comento que en la clase AspNetUsers tienes definida la propiedad 

    public virtual ICollection<Actividades> Actividades { get; set; }

    Dicha clase Actividades se define de la siguiente forma

    [Table("actividades", Schema = "dbo")]
    public class Actividades
    Lo que quisiera preguntar es si tienes en tu estructura de la base de datos la tabla ACTIVIDADES


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 29 de julio de 2015 12:26
    Moderador
  • Fijate en tu mensaje de error

    Message: "Error."
    ExceptionMessage: "ERROR: 42P01: no existe la relación «dbo.actividades»"
    ExceptionType: "Npgsql.NpgsqlException"
    StackTrace: " en Npgsql.NpgsqlState.<ProcessBackendResponses>d__0.MoveNext() en Npgsql.ForwardsOnlyDataReader.GetNextResponseObject(Boolean cleanup) en Npgsql.ForwardsOnlyDataReader.GetNextRowDescription() en Npgsql.ForwardsOnlyDataReader.NextResultInternal() en Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean preparedStatement, NpgsqlRowDescription rowDescription) en Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) en Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb) en Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) en System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) en System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<Reader>b__c(DbCommand t, DbCommandInterceptionContext`1 c) en System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) en System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext) en System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior) en System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) en System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)"
    }-

    Dice que no existe la relación dbo.Actividades


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 29 de julio de 2015 12:30
    Moderador

Todas las respuestas

  • hola

    >>Información adicional: No se puede establecer la propiedad 'LockoutEndDateUtc' de 'AspNetUsers' en un valor 'null'. Debe establecer esta propiedad en un valor que no sea NULL de tipo 'System.DateTime'.

    revisa los datos de la tabla parece ser que ese campo tiene un velor nulo cuando no deberia tenerlo, y sino en la clase definir la propiedad como DateTime? con el "?" para que permita nulos

    ademas se supone que obtienes un solo usuario

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

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 28 de julio de 2015 13:43
  • Bueno el problema que tengo ahora es que me da este error, inspeccionado el elemento 

    AspNetUsers usuario

    'usuario.Actividades' produjo una excepción de tipo 'System.Data.Entity.Core.EntityCommandExecutionException'

    vale y me da este error si me voy al advance rest client

    {
    Message: "Error."
    ExceptionMessage: "El tipo 'ObjectContent`1' no pudo serializar el cuerpo de respuesta para el tipo de contenido 'application/json; charset=utf-8'."
    ExceptionType: "System.InvalidOperationException"
    StackTrace: null
    InnerException: {
    Message: "Error."
    ExceptionMessage: "Error getting value from 'Actividades' on 'System.Data.Entity.DynamicProxies.AspNetUsers_14A7A3D9F79EB262B2825A0F56F4398149E81B99CA81D80240A46E54219F6250'."
    ExceptionType: "Newtonsoft.Json.JsonSerializationException"
    StackTrace: " en Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target) en Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue) en Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) en Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) en Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) en Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType) en Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value) en System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding) en System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding) en System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content) en System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken) --- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción --- en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) en System.Runtime.CompilerServices.TaskAwaiter.GetResult() en System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__1b.MoveNext()"
    InnerException: {
    Message: "Error."
    ExceptionMessage: "Error al ejecutar la definición del comando. Vea la excepción interna para obtener detalles."
    ExceptionType: "System.Data.Entity.Core.EntityCommandExecutionException"
    StackTrace: " en System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) en System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) en System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__6() en System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) en System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5() en System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func`1 operation) en System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) en System.Data.Entity.Core.Objects.ObjectQuery`1.Execute(MergeOption mergeOption) en System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption) en System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.Load(MergeOption mergeOption) en System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.Load() en System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.DeferredLoad() en System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.LoadProperty[TItem](TItem propertyValue, String relationshipName, String targetRoleName, Boolean mustBeNull, Object wrapperObject) en System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.<>c__DisplayClass7`2.<GetInterceptorDelegate>b__1(TProxy proxy, TItem item) en System.Data.Entity.DynamicProxies.AspNetUsers_14A7A3D9F79EB262B2825A0F56F4398149E81B99CA81D80240A46E54219F6250.get_Actividades() en GetActividades(Object ) en Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)"
    InnerException: {
    Message: "Error."
    ExceptionMessage: "ERROR: 42P01: no existe la relación «dbo.actividades»"
    ExceptionType: "Npgsql.NpgsqlException"
    StackTrace: " en Npgsql.NpgsqlState.<ProcessBackendResponses>d__0.MoveNext() en Npgsql.ForwardsOnlyDataReader.GetNextResponseObject(Boolean cleanup) en Npgsql.ForwardsOnlyDataReader.GetNextRowDescription() en Npgsql.ForwardsOnlyDataReader.NextResultInternal() en Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean preparedStatement, NpgsqlRowDescription rowDescription) en Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) en Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb) en Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) en System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) en System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<Reader>b__c(DbCommand t, DbCommandInterceptionContext`1 c) en System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) en System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext) en System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior) en System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) en System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)"
    }-
    }-
    }-
    }

    ciertamente cuesta leerlo pero bueno lo importante yo creo que eslo primero, es que tengo que serializar el objeto y luego deserializarlo o algo asi, saludos.

    miércoles, 29 de julio de 2015 12:08
  • he estado viendo tu código de GitHub y te comento que en la clase AspNetUsers tienes definida la propiedad 

    public virtual ICollection<Actividades> Actividades { get; set; }

    Dicha clase Actividades se define de la siguiente forma

    [Table("actividades", Schema = "dbo")]
    public class Actividades
    Lo que quisiera preguntar es si tienes en tu estructura de la base de datos la tabla ACTIVIDADES


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 29 de julio de 2015 12:26
    Moderador
  • Fijate en tu mensaje de error

    Message: "Error."
    ExceptionMessage: "ERROR: 42P01: no existe la relación «dbo.actividades»"
    ExceptionType: "Npgsql.NpgsqlException"
    StackTrace: " en Npgsql.NpgsqlState.<ProcessBackendResponses>d__0.MoveNext() en Npgsql.ForwardsOnlyDataReader.GetNextResponseObject(Boolean cleanup) en Npgsql.ForwardsOnlyDataReader.GetNextRowDescription() en Npgsql.ForwardsOnlyDataReader.NextResultInternal() en Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean preparedStatement, NpgsqlRowDescription rowDescription) en Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) en Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb) en Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) en System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) en System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<Reader>b__c(DbCommand t, DbCommandInterceptionContext`1 c) en System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) en System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext) en System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior) en System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) en System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)"
    }-

    Dice que no existe la relación dbo.Actividades


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 29 de julio de 2015 12:30
    Moderador
  • Si que existen en la base dedatos la tabla Actividades y relacionada con AspNetUsers tambien, aunque lo mismo puede estar fallando el modelo mio de datos, seguramente porque en la base de datos podras ver que si existe la relacion hecha, estoy usando PostgreSQL por ser libre la base de datos, aqui tienes la relacion creada en la base de datos y logicamnete la tabla actividades existe. 

    CREATE TABLE dbo."Actividades"
    (
      "Id" bigint NOT NULL,
      "Nombre" character varying(100),
      "Informacion" text,
      "Direccion" character varying(250),
      "Horarioinicial" timestamp without time zone, -- creo que este campo funciona con el tipo de dato en C# Datetime
      "Horariofinal" timestamp without time zone,
      "Latitud" character varying(250),
      "Longitud" character varying(250),
      "Altitud" character varying(250),
      "Accuracy" character varying(250),
      "UsuarioID" character varying(128),
      CONSTRAINT "Actividades_pkey" PRIMARY KEY ("Id"),
      CONSTRAINT "FK_UsuarioID_AspNetUsers_Id" FOREIGN KEY ("UsuarioID")
          REFERENCES dbo."AspNetUsers" ("Id") MATCH SIMPLE
          ON UPDATE CASCADE ON DELETE CASCADE
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE dbo."Actividades"
      OWNER TO postgres;
    GRANT ALL ON TABLE dbo."Actividades" TO postgres;
    GRANT ALL ON TABLE dbo."Actividades" TO public;
    COMMENT ON COLUMN dbo."Actividades"."Horarioinicial" IS 'creo que este campo funciona con el tipo de dato en C# Datetime';
    
    
    -- Index: dbo."FKI_UsuarioID_AspNetUsers_Id"
    
    -- DROP INDEX dbo."FKI_UsuarioID_AspNetUsers_Id";
    
    CREATE INDEX "FKI_UsuarioID_AspNetUsers_Id"
      ON dbo."Actividades"
      USING btree
      ("UsuarioID" COLLATE pg_catalog."default");
    
    -- Index: dbo."FKI_UsuarioID_Id"
    
    -- DROP INDEX dbo."FKI_UsuarioID_Id";
    
    CREATE INDEX "FKI_UsuarioID_Id"
      ON dbo."Actividades"
      USING btree
      ("UsuarioID" COLLATE pg_catalog."default");
    
    

    Esta echo con SQL DDL si te fijas, yo estoy seguro de que el fallo esta en el modelo, ¿donde estara el error? le echare un ojo a los modelos donde se relaciona tablas 1 a muchos, saludos.

    sábado, 1 de agosto de 2015 11:48