2010-11-26 17 views
44

Tengo una aplicación de consola y lo que intento hacer es que cada vez que se ejecute la aplicación, la fecha y la hora se envíen a una tabla dentro de mi base de datos.Error 3002: problema en el mapeo de fragmentos | C# linq a entidades

La estructura de la tabla es de esta manera:

FTPRuns 

ID int 

Last Run datetime 

lo suficientemente simple.

He actualizado el model.edmx dentro de mi aplicación también para reflejar este nuevo cambio. Sin embargo, ahora estoy obteniendo el siguiente error y no estoy del todo seguro de lo que significa.

Error 3002: Problema en mapeo fragmentos a partir de la línea 1330: Potencial violación de tiempo de ejecución de claves de FTPRuns de mesa (FTPRuns.ID): columnas (FTPRuns.ID) se asignan a las propiedades de EntitySet FTPRuns (FTPRuns.ID) en el lado conceptual pero no forman las propiedades de la clave de EntitySet (FTPRuns.ID, FTPRuns.LastRun).

Aquí es el fragmento de código que utilizo para actualizar la base de datos también:

using (ModelContainer ctn = new ModelContainer()) 
      { 
       try 
       { 
        FTPRun ftp = new FTPRun 
        { 
         LastRun = DateTime.Now 
        }; 

        ctn.FTPRuns.AddObject(ftp); 

        int changes = ctn.SaveChanges(); 

        Console.WriteLine(changes.ToString() + " Changes saved"); 
        Console.WriteLine("The LastRun Date Has Been Updated"); 
       } 
       catch (InvalidOperationException ex) 
       { 
        Console.WriteLine(ex.ToString()); 
       } 
      } 

Si alguien me puede ayudar estaría muy agradecido :)

gracias.

+0

¿Qué tipo de base de datos está utilizando y cuáles son las claves principales en la tabla? –

+0

Disculpas, estoy usando una base de datos de SQL Server, y he configurado la columna ID como la clave principal. – 109221793

Respuesta

76

Su modelo de entidad tiene la combinación de las dos propiedades FTPRuns.ID y FTPRuns.LastRun como clave de entidad, mientras que su tabla solo tiene la columna FTPRuns.ID como clave principal. Por lo tanto, en su modelo, especifique que la combinación de FTPRuns.ID y FTPRuns.LastRun debe ser única, mientras que su base de datos tiene el requisito más estricto de que FTPRuns.ID sea único.

Solo excluya la propiedad FTPRuns.LastRun de la clave de entidad. Tal vez esto sucedió accidentalmente o el Entity Framework no pudo obtener la información de la clave principal de la base de datos y tuvo que inferir la clave de la entidad. Por ejemplo, las vistas no tienen clave principal y Entity Framework inferirá la clave de entidad como la combinación de todas las columnas que no admiten nulos.

+3

¡Estaba publicando una respuesta a mi pregunta mientras respondía! Comprobé el modelo.edmx y vi que tenía establecido LastRun también como clave de entidad. No estoy seguro de cómo sucedió eso: S pero está arreglado ahora :) Gracias por la respuesta. Marcaré como correcto una vez que se termine el límite de tiempo. – 109221793

+1

¡Gracias! En mi caso, agregué una columna de clave principal y no pude anular la selección de la clave principal anterior por algún motivo. – RayLoveless

18

esto me sucedió cuando cambié el campo de clave en la tabla (en la base de datos) y actualicé el modelo de entidad.

La clave anterior todavía estaba allí en el modelo, así que entré en las propiedades del objeto en el archivo .edmx y establecí la clave en False. Eso lo solucionó

+1

¡Me pasó lo mismo! – Darkenor

+0

lo mismo conmigo. – RayLoveless

11

Borré la mesa de la edmx (en edmx elegir la mesa que causan problemas -> clic derecho -> eliminar) y luego realizar "modelo actualizado de la base de datos"

que lo fijó para mí

+0

Esto funcionó para mí hoy. – PCPGMR

2

Borré todas las tablas de edmx y luego "Actualizar el modelo de la base de datos". Verifique también que tenga un propietario de la base de datos.

3

Olvidé establecer una clave principal al crear una nueva tabla, así que fui a SQL Management Studio para hacerlo. Una vez hecho esto, actualicé el archivo model.edmx para reflejar los cambios y recibí el error 3002.

Lo que había hecho, al actualizar el modelo, era establecer todas las columnas de la tabla como "claves de entidad". Por lo tanto, al visualizar el archivo model.edmx, busque la tabla correspondiente y haga clic con el botón secundario en las diferentes propiedades para asegurarse de que solo la clave principal tenga seleccionada la "clave de entidad". Eso resolvió mi problema.

1

Compruebe la clave principal para la tabla, si existe, entonces 1) Abra el archivo .edmx, seleccione todas las tablas y elimine del modelo. 2) Actualizar el modelo de DB y Agregar todas las tablas necesarias nuevamente

20

Daniel Brückner ¡La solución funcionó perfectamente para mí! A continuación se detalla lo que él instruyó, pero en una forma gráfica, que puede ayudar a los lectores perezosos :).

Lo que se quiere tener en cuenta es que su PK en el Modelo decir

enter image description here

Podemos ver que tengo una PK llama id. Ahora bien, si miro a mi modelo de EF:

enter image description here

puedo ver solamente 1 tecla especificada, lo cual es correcto. Para mí, este no era el caso, las 4 columnas eran claves.

Si hace clic en la columna (en el diagrama de EF en VS) obtendrá la opción de marcar/desmarque la Entity Key:

enter image description here

asegurarse de que esto coincida con su modelo. En mi caso, solo se debe marcar id, guardar y construir proyecto.

+0

Gracias por considerarnos lectores perezosos. – UpAllNight

+0

Excelente respuesta, muchas gracias. –

4

Eliminé la entidad y la clase del navegador de modelos e hice una actualización desde la base de datos asegurándome de seleccionar la tabla. Esto resolvió el problema para mí.

Cuestiones relacionadas