He reducido esto a un problema entre Code First y Database first EF, pero no estoy seguro de cómo solucionarlo. Trataré de ser lo más claro posible, pero, sinceramente, me estoy perdiendo parte de la comprensión aquí. Esto es Entity Framework 4.4
Heredé un proyecto en el que se utilizó Entity Framework, pero muchos de los archivos reales se eliminaron sin una forma real de volver atrás. Volví a agregar EF (la base de datos primero) y repliqué una configuración T4 sobre la que se construyó el proyecto. Generaba versiones de código de todos los modelos de base de datos y un archivo de código DBContext.
Si mi cadena de conexión parece una cadena de conexión .NET "normal", obtengo un error sobre una columna no válida. El nombre "ProcessState_ID" no existe. ProcessState_ID no está en la base del código en absoluto, no está en el archivo EDMX ni nada. Esto parece ser una conversión EF automática en la consulta.
Cuando hago que la cadena de conexión coincida con el modelo de Entity Framework, funciona bien.
Ahora, al intentar hacer coincidir el código anterior con Entity Framework, me gustaría mantener la cadena de conexión .NET "normal".
Entonces tengo dos preguntas aquí: 1. ¿Cuál es una buena manera de pasar de una cadena de conexión normal a una cadena de conexión EF en el código? 2. ¿Hay otra solución aquí que no veo para detener el error de nombre de columna no válido?
fuente
public virtual Person Person { get; }
Respuestas:
Compruebe si tiene ICollections.
Lo que he descubierto es que cuando tienes un ICollection que hace referencia a una tabla y no hay una columna que pueda descifrar, crea una para que intentes hacer la conexión entre las tablas. Esto sucede específicamente con ICollection y me ha vuelto "loco" tratando de resolverlo.
fuente
Esta es una entrada tardía para aquellos (como yo) que no entendieron de inmediato las otras 2 respuestas.
Entonces...
EF está tratando de mapear el nombre ESPERADO de la REFERENCIA DE CLAVE DE LAS TABLAS DE LOS PADRES ... y dado que ... el nombre de la CLAVE EXTRANJERA fue "cambiado o acortado" en la relación de la TABLA DE NIÑOS de las bases de datos ... obtendría el mensaje de arriba.
(esta solución puede diferir entre las versiones de EF)
PARA MÍ, LA SOLUCIÓN FUE:
AGREGAR el atributo "ForeignKey" al modelo
fuente
Category_Id
. Ha mencionado acerca de las correcciones para diferentes versiones de EF, ¿verdad? Estoy usando EF 6.0 ¿Cuál es la solución que puedo solucionar?*_ID
. Incluir la referencia posterior funcionó bien.[MetadataType(typeof(MetaData))] public partial class Tour { public class MetaData { [ForeignKey(nameof(TourCategory))] public virtual TourCategory TourCategory { get; set; } } }
Santo cielo, después de muchas horas de intentarlo, finalmente me di cuenta de esto.
Primero estoy haciendo la base de datos EF6 y me preguntaba sobre el error de "columna desconocida de extensión": estaba generando el nombre de la tabla con el nombre de la columna de subrayado por alguna razón y tratando de encontrar una columna inexistente.
En mi caso, una de mis tablas tenía dos referencias de clave externa a la misma clave principal en otra tabla, algo como esto:
EF estaba generando algún nombre de la columna extraño como
Owners_AnimalID1
yOwners_AnimalID2
y luego procedió a romperse.¡El truco aquí es que estas confusas claves externas deben registrarse con EF usando Fluent API!
En el contexto de su base de datos principal, anule el
OnModelCreating
método y cambie la configuración de la entidad. Preferiblemente, tendrá un archivo separado que amplía laEntityConfiguration
clase, pero puede hacerlo en línea.De cualquier forma que lo haga, deberá agregar algo como esto:
Y con eso, EF (quizás) comenzará a funcionar como esperabas. Auge.
Además, obtendrá el mismo error si usa lo anterior con una columna anulable, solo use en
.HasOptional()
lugar de.HasRequired()
.Aquí está el enlace que me puso sobre la joroba:
https://social.msdn.microsoft.com/Forums/en-US/862abdae-b63f-45f5-8a6c-0bdd6eeabfdb/getting-sqlexception-invalid-column-name-userid-from-ef4-codeonly?forum=adonetefx
Y luego, los documentos de Fluent API ayudan, especialmente los ejemplos de clave externa:
http://msdn.microsoft.com/en-us/data/jj591620.aspx
También puede poner las configuraciones en el otro extremo de la llave, como se describe aquí:
http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx .
Hay algunos problemas nuevos con los que me estoy enfrentando ahora, pero esa era la gran brecha conceptual que faltaba. ¡Espero eso ayude!
fuente
Supuestos:
Table
OtherTable
OtherTable_ID
Ahora elija una de estas formas:
UNA)
Eliminar
ICollection<Table>
Si tiene algún error relacionado con el
OtherTable_ID
momento en que está recuperandoTable
, vaya a suOtherTable
modelo y asegúrese de que no tenga unICollection<Table>
archivo allí. Sin una relación definida, el marco asumirá automáticamente que debe tener un FK para OtherTable y creará estas propiedades adicionales en el SQL generado.SI)
OtherTableId
aTable
y
OtherTableId
en laTable
base de datosfuente
En mi caso, estaba definiendo incorrectamente una clave principal compuesta por dos claves externas como esta:
El error que recibía era "nombre de columna no válido Bar_ID".
Especificar la clave primaria compuesta correctamente solucionó el problema:
fuente
Para mí, la causa de este comportamiento se debió a un problema con el mapeo definido con Fluent API. Tenía 2 tipos relacionados, donde el tipo A tenía un objeto de tipo B opcional y el tipo B tenía muchos objetos A.
Había definido el mapeo con una api fluida como esta:
Pero el problema era que el tipo B tenía propiedad de navegación
List<A>
, por lo que tuveSQLException Invalid column name A_Id
Adjunté Visual Studio Debug a EF DatabaseContext.Database.Log para generar SQL generado a VS Output-> Debug window
Y el SQL generado tenía 2 relaciones de la tabla B -> una con la identificación correcta y otra con la
A_Id
El problema del problema era que no agregué esta
B.List<A>
propiedad de navegación al mapeo.Así es como en mi caso tenía que ser el mapeo correcto:
fuente
En mi caso, la causa de este problema fue una restricción de LLAVE EXTRANJERA faltante en una base de datos migrada. Por lo tanto, la colección virtual virtual existente no se cargó correctamente.
fuente
También tuve este problema y parece que hay algunas causas diferentes. Para mí, tenía una propiedad id definida erróneamente como int en lugar de long en la clase principal que contenía un objeto de navegación. El campo id en la base de datos se definió como bigint que corresponde a long en C #. Esto no causó un error de tiempo de compilación, pero causó el mismo error de tiempo de ejecución que obtuvo el OP:
fuente
Para mí, el problema es que tuve la tabla asignada en mi aplicación dos veces: una a través de Code First, una vez a través de Database First.
Eliminar cualquiera de los dos resuelve el problema en mi caso.
fuente
Para mí, sucedió debido a los problemas de pluralización de EF. Para las tablas que terminan con algo como "-Status", EF piensa que su singular es "-Statu". Cambiar la entidad y el nombre de la tabla de la base de datos a "-StatusTypes" lo solucionó.
De esta manera, no necesitaría cambiar el nombre de los modelos de entidad cada vez que se actualiza.
fuente
Si tiene referencias de clave externa a la misma tabla más de una vez, puede usar InverseProperty
Algo como esto-
fuente
Para mí (usando Visual Studio 2017 y el modelo de base de datos primero en Entity Framework 6.1.3), el problema desapareció después de reiniciar Visual Studio y Rebuilding.
fuente
En mi caso, los datos de mi método de inicialización seguían llamando a una columna de tabla que se había eliminado en una migración anterior. Verifique sus asignaciones si está utilizando Automapper.
fuente
En mi caso, ya tengo una base de datos (Database first). Gracias a todos los comentarios aquí, encontré mi solución:
Las tablas deben tener la relación, pero el nombre de las columnas debe ser diferente y agregar el atributo ForeignKey.
[ForeignKey ("PrestadorId")] público virtual AwmPrestadoresServicios Colaboradores {get; conjunto; }
Es decir, PRE_ID es PK, pero FK en la otra tabla es PRESTADOR_ID, entonces funciona. Gracias a todos los comentarios aquí encontré mi solución. EF funciona de formas misteriosas.
fuente
Si tiene este problema con una propiedad de navegación en la misma tabla, tendrá que cambiar el nombre de nuestra propiedad.
Por ejemplo :
Vas a tener que cambiar
AncestorId
dePersonId
.Parece que EF está tratando de crear una clave
ParentId
porque no pudo encontrar una tabla llamada Ancestor ...EDITAR: ¡Esta es una solución para la base de datos primero!
fuente