Este es un error que me ha hecho perder un buen rato mientras trabajaba con objetos POCO en Entity Framework 4, y espero que pueda ayudar a alguien que se encuentre con el mismo problema.
El tema comienza con el lanzamiento de una excepción InvalidOperationException
justo en el momento de crear un ObjectSet<T>
, como en el siguiente código:
class MiContexto : ObjectContext
{
...
private ObjectSet<Cliente> clientes;
public ObjectSet<Cliente> Clientes
{
get
{
return clientes ??
(clientes = CreateObjectSet<Cliente>());
}
}
}
Hay ocasiones en las que la excepción lanzada al crear el ObjectSet
es de tipo MetadataException
, y contiene información suficiente para detectar el error, por lo que es sencillo dar con la solución.
Sin embargo, este InvalidOperationException
y el texto que la acompaña (no se encontró la información de metadatos y asignaciones para EntityType ‘Namespace.Entidad’) son bastante confusos. De hecho, supongo que al ver esta descripción lo normal es que ponerse como loco a destripar el EDM para ver a dónde se ha ido la información de metadatos y asignaciones, a cambiar los namespaces… y por supuesto, todo en vano.
Tras un buen rato de infructuosa investigación, acudí a Google, ese que todo lo sabe, y encontré la primera recomendación si esto te ocurre: revisa minuciosamente la definición de tus entidades POCO. Éstas deben coincidir exactamente con la definición del modelo conceptual, tanto en sus propiedades escalares, de tipos complejos y las propiedades de navegación.
Y el «minucionamente» no sobra. En mi caso había definido de forma incorrecta una propiedad de navegación, y por más que repasaba no veía ningún error; obviamente, desconfié de la recomendación que había encontrado, y me puse de nuevo a buscar la solución por mi cuenta: seguí escudriñando el EDM, regenerándolo, eliminando entidades que no usaba, modificándolas… para nada, claro.
Al final, la moraleja de esta historia es la siguiente: aunque pienses que tus entidades son correctas, vuelve a revisarlas, que fijo que algo te estás dejando por detrás.
Espero que, a diferencia de uno que yo me sé ;-), esta tontería no os haga perder mucho tiempo.
Publicado en: Variable not found.