Entity Framework Core no puede agregar la Entidad pero puede Seleccionarla


Mi problema es:

Puedo seleccionar una entidad normalmente, pero cuando un intento de añadirla, estoy recibiendo la excepción:

ORA-06550: linha 3, coluna 22:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: linha 3, coluna 1:
PL/SQL: SQL Statement ignored

Context below:

Mi base de datos: Oracle
Propietario (esquema que tiene los datos): XXX
Usuario en conexión (usuario que tiene permisos para seleccionar, insertar, etc): Sí.

Estoy asegurando que los subsidios estén bien. Puedo insertar manualmente los datos.

Mi Entidad en mi API se declara como:

[Tabla("TABLE_NAME", Schema = "XXX")]
clase pública AnalyzeFeedback

Seleccione Aceptar

            IQueryable analyzeFeedbacks = dbContext.AnalyzeFeedbacks;

            var query = (from u in analyzeFeedbacks
                         select u);

            var sql = query.ToSql();

            var result = query.FirstOrDefault();

Este selecto devuelve el primer registro de mi tabla. Perfectamente.

Cuando intento agregar un nuevo disco:

Insertar problema: Excepción en SaveChanges

        dbContext.AnalyzeFeedbacks.Add(feedback);
        dbContext.SaveChanges();

En "SaveChanges" es cuando estoy recibiendo el error.

Lo siento si no estoy lo suficientemente claro en mi explicación.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por binarybrainiac


3 Respuestas:

  • También AnalyzeFeedback tiene propiedades de referencia/campos

    Este es exactamente mi problema hombre, gracias.

    Mi entidad tiene una propiedad que no etiqueta correctamente:

    [ForeignKey("AnalyzeId")]
    public Analyze Analyze { get; set; }
    
    [NotMapped] <<< this!
    public List Basements { get; set; }
    

    Cuando un etiquetado como "NoMapped", el inserto oculto como se esperaba.

    ¡Gracias por tu respuesta Gullard!

    Respondida el Dec 18, 2020 a las 14:19 - por byteninja

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás recibiendo indica que la tabla o vista que estás intentando modificar no existe en la base de datos Oracle. Esto puede deberse a que la entidad AnalyzeFeedback no está correctamente mapeada a la tabla correspondiente en la base de datos.

    Para solucionar este problema, asegúrate de revisar lo siguiente:

    • Verifica que la tabla en la base de datos Oracle tenga el nombre y el esquema correctos que estás especificando en la anotación `[Table("TABLE_NAME", Schema = "XXX")]`.
    • Asegúrate de que la entidad `AnalyzeFeedback` esté configurada correctamente en tu modelo de Entity Framework Core, con todas las propiedades mapeadas adecuadamente a las columnas de la tabla.
    • Comprueba que la conexión a la base de datos se esté estableciendo correctamente y que el usuario tenga los permisos necesarios para modificar la tabla en cuestión.

    Si todo está configurado correctamente y sigues experimentando el error, puedes intentar lo siguiente:

    • Verificar si hay errores de migraciones pendientes que puedan estar afectando la estructura de la base de datos.
    • Revisar los logs de Oracle para obtener más información sobre el error específico que está ocurriendo al intentar realizar la inserción.

    Espero que estos consejos te ayuden a resolver el problema y puedas realizar la inserción de la entidad AnalyzeFeedback correctamente en tu base de datos Oracle. Si necesitas más ayuda, no dudes en preguntar.

    Respondida el Dec 19, 2020 a las 14:18 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Problema:

    Entity Framework Core no puede insertar una entidad en una tabla de Oracle debido a un error de "tabla o vista no existe".

    Solución:

    1. Verificar permisos:

    Asegúrate de que el usuario de la conexión a la base de datos tenga permisos suficientes para insertar datos en la tabla.

    2. Verificar el esquema:

    Verifica que el esquema especificado en el atributo [Tabla] exista en la base de datos.

    3. Verificar la sintaxis:

    Revisa cuidadosamente la sintaxis de la consulta de inserción y asegúrate de que el nombre de la tabla y el esquema sean correctos.

    4. Habilitar procedimientos almacenados:

    Si estás utilizando Entity Framework Core con Oracle, asegúrate de haber habilitado el uso de procedimientos almacenados en el contexto de la base de datos. Puedes hacer esto agregando la siguiente línea a tu código de configuración del contexto:

    
    modelBuilder.UseOracleSQLCompatibility(OracleSQLCompatibilityMode.Process);
    

    Ejemplo de código actualizado:

    csharp
    using Microsoft.EntityFrameworkCore;
    
    namespace YourNamespace
    {
        public class MyDbContext : DbContext
        {
            public DbSet AnalyzeFeedbacks { get; set; }
    
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseOracleSQLCompatibility(OracleSQLCompatibilityMode.Process);
                optionsBuilder.UseOracle("connection string");
            }
        }
    }
    

    5. Utilizar un procedimiento almacenado:

    Si los pasos anteriores no resuelven el problema, considera utilizar un procedimiento almacenado para insertar datos en la tabla. Esto puede evitar problemas relacionados con los permisos y la sintaxis de las consultas.

    Ejemplo de procedimiento almacenado:

    sql
    CREATE OR REPLACE PROCEDURE INSERT_ANALYZEFEEDBACK(
        FEEDBACK_ID IN NUMBER,
        USER_ID IN NUMBER,
        FEEDBACK_TEXT IN VARCHAR2)
    AS
    BEGIN
        INSERT INTO TABLE_NAME (FEEDBACK_ID, USER_ID, FEEDBACK_TEXT)
        VALUES (FEEDBACK_ID, USER_ID, FEEDBACK_TEXT);
    END;
    

    Ejemplo de código de inserción usando un procedimiento almacenado:

    csharp
    using System.Data.Common;
    
    namespace YourNamespace
    {
        public class AnalyzeFeedbackService
        {
            private readonly MyDbContext _dbContext;
    
            public AnalyzeFeedbackService(MyDbContext dbContext)
            {
                _dbContext = dbContext;
            }
    
            public void InsertFeedback(AnalyzeFeedback feedback)
            {
                using (DbCommand cmd = _dbContext.Database.GetDbConnection().CreateCommand())
                {
                    cmd.CommandText = "INSERT_ANALYZEFEEDBACK";
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add(new OracleParameter("FEEDBACK_ID", feedback.FeedbackId));
                    cmd.Parameters.Add(new OracleParameter("USER_ID", feedback.UserId));
                    cmd.Parameters.Add(new OracleParameter("FEEDBACK_TEXT", feedback.FeedbackText));
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
    

    Respondida el Dec 19, 2020 a las 14:30 - por Gemini

    Votos positivos: 0 | Votos negativos: 0