Tengo una base de datos existente con la que me gustaría construir una nueva aplicación usando EF4.0
Algunas tablas no tienen claves primarias definidas, de modo que cuando creo un nuevo modelo de datos de entidad, recibo el siguiente mensaje:
The table/view TABLE_NAME does not have a primary key defined
and no valid primary key could be inferred. This table/view has
been excluded. To use the entity, you will need to review your schema,
add the correct keys, and uncomment it.
Si quiero usarlos y modificar datos, ¿debo agregar necesariamente un PK a esas tablas, o hay una solución para no tener que hacerlo?
.net
entity-framework
Cris
fuente
fuente
Respuestas:
El error significa exactamente lo que dice.
Incluso si pudieras solucionar esto, confía en mí, no quieres. La cantidad de errores confusos que podrían introducirse es asombrosa y aterradora, sin mencionar el hecho de que su rendimiento probablemente se irá por los aires.
No evites esto. Arregla tu modelo de datos.
EDITAR: He visto que varias personas están rechazando esta pregunta. Eso está bien, supongo, pero tenga en cuenta que el OP preguntó sobre el mapeo de una tabla sin una clave primaria, no una vista . La respuesta sigue siendo la misma. Evitar la necesidad de EF de tener un PK en las tablas es una mala idea desde el punto de vista de la capacidad de administración, la integridad de los datos y el rendimiento.
Algunos han comentado que no tienen la capacidad de corregir el modelo de datos subyacente porque están asignando a una aplicación de terceros. Esa no es una buena idea, ya que el modelo puede cambiar por debajo de usted. Podría decirse que, en ese caso, querrá asignar a una vista, que, de nuevo, no es lo que solicitó el OP.
fuente
Creo que esto lo resuelve Tillito:
Entity Framework y SQL Server View
Citaré su entrada a continuación:
Tuvimos el mismo problema y esta es la solución:
Para obligar al marco de la entidad a usar una columna como clave principal, use ISNULL.
Para forzar que el marco de la entidad no use una columna como clave principal, use NULLIF.
Una manera fácil de aplicar esto es envolver la declaración select de su vista en otra selección.
Ejemplo:
respondido 26/04/10 a las 17:00 por Tillito
fuente
Para aquellos que llegan a esta pregunta y están utilizando Entity Framework Core, ya no es necesario agregar necesariamente una PK a esas tablas o hacer ninguna solución alternativa. Desde EF Core 2.1 tenemos una nueva característica Tipos de consulta
Los tipos de consulta deben usarse para:
Entonces, en su DbContext, simplemente agregue la siguiente propiedad de tipo en
DbQuery<T>
lugar de laDbSet<T>
siguiente. Asumiendo que el nombre de su tabla esMyTable
:fuente
Las claves compuestas también se pueden hacer con Entity Framework Fluent API
fuente
modelBuilder.Entity<T>()
llamada en cadena.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
para esas claves tan especiales que no son naturales o compuestas, pero que pueden confiarse sobre ser único (por lo general, de todos modos)En mi caso, tuve que asignar una entidad a una Vista, que no tenía clave primaria. Además, no se me permitió modificar esta Vista. Afortunadamente, esta vista tenía una columna que era una cadena única. Mi solución fue marcar esta columna como clave principal:
Engañado EF. Funcionó perfectamente, nadie se dio cuenta ... :)
fuente
UserID
columna si usa el enfoque Code First ..!Itentity
función. Básicamente, si estoy en lo cierto, seguirá creando unaUserID
columna para usted como PK, pero no aumentará automáticamenteUserID
cuando cree un nuevo registro como lo haría de forma predeterminada. Además, aún debe mantener valores distintosUserID
.EF no requiere una clave primaria en la base de datos. Si lo hiciera, no podría vincular entidades a las vistas.
Puede modificar el SSDL (y el CSDL) para especificar un campo único como su clave principal. Si no tiene un campo único, entonces creo que tiene una manguera. Pero realmente debería tener un campo único (y un PK), de lo contrario, tendrá problemas más adelante.
Erick
fuente
Tener una clave de identidad inútil es inútil a veces. Encuentro si la identificación no se usa, ¿por qué agregarla? Sin embargo, la entidad no es tan indulgente con eso, por lo que sería mejor agregar un campo ID. Incluso en el caso de que no se use, es mejor que lidiar con los errores incesantes de la entidad sobre la clave de identidad faltante.
fuente
ESTA SOLUCIÓN FUNCIONA
No necesita mapear manualmente, incluso si no tiene una PK. Solo necesita decirle al EF que una de sus columnas es index y la columna index no es anulable.
Para hacer esto, puede agregar un número de fila a su vista con la función isNull como la siguiente
ISNULL(id, number)
es el punto clave aquí porque le dice al EF que esta columna puede ser la clave principalfuente
Las respuestas anteriores son correctas si realmente no tiene una PK.
Pero si hay uno pero simplemente no está especificado con un índice en la base de datos, y no puede cambiar la base de datos (sí, trabajo en el mundo de Dilbert), puede asignar manualmente los campos para que sean la clave.
fuente
Esta es solo una adición a la respuesta de @Erick T. Si no hay una sola columna con valores únicos, la solución consiste en utilizar una clave compuesta, como se indica a continuación:
De nuevo, esto es solo una solución. La solución real es arreglar el modelo de datos.
fuente
Esto quizás tarde para responder ... sin embargo ...
Si una tabla no tiene una clave primaria, entonces hay algunos escenarios que deben analizarse para que el EF funcione correctamente. La regla es: EF trabajará con tablas / clases con clave primaria. Así es como se hace el seguimiento ...
Digamos, su tabla 1. Los registros son únicos: la unicidad está hecha por una sola columna de clave externa: 2. Los registros son únicos: la unicidad está hecha por una combinación de múltiples columnas. 3. Los registros no son únicos (en su mayor parte *).
Para los escenarios n. ° 1 y n. ° 2, puede agregar la siguiente línea al método OnModelCreating del módulo DbContext: modelBuilder.Entity (). HasKey (x => new {x.column_a, x.column_b}); // tantas columnas como sean necesarias para que los registros sean únicos.
Para el escenario # 3, aún puede usar la solución anterior (# 1 + # 2) después de estudiar la tabla (* lo que hace que todos los registros sean únicos de todos modos). Si debe incluir TODAS las columnas para que todos los registros sean únicos, puede agregar una columna de clave principal a su tabla. Si esta tabla es de un proveedor externo, clone esta tabla en su base de datos local (durante la noche o la cantidad de tiempo que necesite) con la columna de clave principal agregada arbitrariamente a través de su secuencia de comandos de clonación.
fuente
Entity Framework: Agregar DataTable sin clave primaria al modelo de entidad.
fuente
Actualice a la respuesta de @CodeNotFound .
En EF Core 3.0
DbQuery<T>
ha quedado en desuso, en su lugar, debe usar tipos de entidad sin clave que supuestamente hacen lo mismo. Estos se configuran con elHasNoKey()
método ModelBuilder . En su clase DbContext, haga estoSin embargo, existen restricciones, en particular:
Esto significa que para la cuestión de
No puede modificar los datos de esta manera; sin embargo, puede leer. Sin embargo, podría imaginarse usar otra forma (por ejemplo, ADO.NET, Dapper) para modificar datos; esta podría ser una solución en casos en los que rara vez necesita realizar operaciones que no sean de lectura y todavía le gustaría seguir con EF Core para sus casos mayoritarios.
Además, si realmente necesita / desea trabajar con tablas de montón (sin clave), considere deshacerse de EF y use otra forma de hablar con su base de datos.
fuente
Desde un punto de vista práctico, cada mesa, incluso una mesa desnormalizada como una mesa de almacén, debe tener una clave primaria. O, en su defecto, al menos debería tener un índice único no anulable.
Sin algún tipo de clave única, los registros duplicados pueden (y aparecerán) en la tabla, lo cual es muy problemático tanto para las capas ORM como para la comprensión básica de los datos. Una tabla que tiene registros duplicados es probablemente un síntoma de mal diseño.
Como mínimo, la tabla debe tener al menos una columna de identidad. Agregar una columna de ID de generación automática tarda aproximadamente 2 minutos en SQL Server y 5 minutos en Oracle. Para ese esfuerzo extra, se evitarán muchos, muchos problemas.
fuente
También encontramos este problema, y aunque teníamos una columna que tenía nulos, lo importante era que teníamos una columna dependiente que no tenía nulos y que la combinación de estas dos columnas era única.
Entonces, para citar la respuesta dada por Pratap Reddy, funcionó bien para nosotros.
fuente
Estoy muy feliz de que mi problema esté resuelto.
No se puede actualizar el EntitySet, porque tiene un DefiningQuery y no existe ningún elemento <UpdateFunction>
y haz esto: mira debajo de esa línea y encuentra la etiqueta. Tendrá una gran declaración de selección. Elimine la etiqueta y su contenido.
ahora sin cambiar DB TI puede insertar en una tabla que no tiene PK
gracias a todos y gracias Pharylon
fuente
En EF Core 5.0, también podrá definirlo a nivel de entidad.
Referencia: https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-5.0/whatsnew#use-ac-attribute-to-indicate-that-an-entity- no tiene llave
fuente
La tabla solo necesita tener una columna que no permita valores nulos
fuente