2012-02-02 14 views
9

Estoy creando una nueva aplicación MVC 3.
Las medidas adoptadas:
1. Agregado nuevo modelo haciendo clic derecho sobre modelos y la adición de "LINQ a SQL Clases"
2. mesas arrastrados desde el Explorador de servidores a mi nuevo diseño dbml y se guardan
3. Haga clic derecho sobre Controllers- > Add-> controlador
4. Introduzca la siguiente información:
MVC3 Agregar error de andamio de controlador - Tipo de contexto no admitido

Controller name: UserController
Template: Controller with read/write actions and views, using Entity Framework
Model Class: aspnet_User (TierPay)
Data Context Class: AgricultureDataContext (TierPay)
Views: Razor (VBHTML)

5.Click Añadir
6.Get el siguiente error:
Unsuppo rted tipo de contexto.

He buscado en Google y no he encontrado ninguna respuesta. Gracias!

+0

estaba recibiendo el mismo problema. Por alguna razón, el contexto de datos autogenerados es el incorrecto ... todo el tiempo. –

Respuesta

19

que estaba recibiendo este error cuando se trabaja con el modelo de datos de entidad en lugar de LINQ a SQL. Creé el modelo a partir de una base de datos SQL Server existente. El problema fue causado al seleccionar la clase de contexto de datos incorrecta en el cuadro de diálogo Agregar controlador. Ese valor debe ser la clase de nivel superior, en mi caso, el que tiene "Entitidades" como parte del nombre. Espero que esto ayude.

Add new Controller to MVC project From Entity Models

+1

Sé que esto es un par de años después, pero esta respuesta me ayuda, gracias Ken. – Rod

0

No estoy seguro si esto es exactamente lo que estabas buscando ... pero noté el mismo error yo mismo ... Google no fue de mucha ayuda y terminé detectando el problema yo mismo.

Posible solución:

Si va a crear un modelo que contiene una clase de EF (Entity Framework) que se extiende a otra clase .. Asegúrese de que se está extendiendo ese constructor de la clase de EF está destinado y no el modelo Archivo de clase involuntariamente.

Pido disculpas por la pobre explicación, pero soy nuevo en esto .. Avíseme si esto ayuda.

Saludos

+1

Gracias por la información. Estoy usando LINQ to SQL en lugar de EF. Hasta ahora he descubierto que puedo agregar una vista fuertemente tipada haciendo clic derecho en el nombre de la función y seleccionando agregar vista, por lo que mi solución es agregar el controlador sin andamios y luego agregar la vista escrita al modelo LINQ. – fhilton

12

Este diálogo es confuso al principio, cuando se utiliza la base de datos de primera opción Marco de la entidad.

Si está utilizando DB primero, tanto el menú desplegable "clase de modelo" como el menú desplegable "clase de contexto de datos" parecerán tener los mismos nombres de clase.

Si, por ejemplo, intenta crear un controlador vinculado a un modelo de tipo "Usuario", supongamos que verá "Usuario" tanto en la lista desplegable del modelo como en la parte "Contexto de datos" de el diálogo.

En la parte de "clase de modelo" del cuadro de diálogo, desea seleccionar su modelo (Usuario en nuestro ejemplo aquí).

En la parte "Clase de contexto de datos" del cuadro de diálogo, no desea seleccionar también "Usuario". En su lugar, desea seleccionar la clase que está en su archivo EDMX que hereda de ObjectContext. Habrá una clase como esta en la lista desplegable si está utilizando DB primero. Verá esta clase en la lista y no tengo idea de por qué las otras clases están en la lista. Creo que puede ser un pequeño defecto de UI de Microsoft.

Si no sabe de qué se trata esta clase, simplemente vaya a su modelo EDMX y haga clic en el archivo designer.cs asociado. En la parte superior de este código, verá la clase que hereda de ObjectContext. Esta es la clase que desea seleccionar.

3

Recibí este mensaje de error cuando mezclé la "clase de modelo" y la "clase de contexto de datos".

0

I depurado este problema en WinDbg y es causada por el Microsoft.VisualStudio.Web.Mvc.Scaffolding.BuiltIn.EntityFrameworkServices siguiente método:

 
internal static bool IsValidContextType(Type contextType) 
{ 
    return (typeof(ObjectContext).IsAssignableFrom(contextType) || ((contextType.BaseType != null) && contextType.BaseType.FullName.Equals("System.Data.Entity.DbContext", StringComparison.OrdinalIgnoreCase))); 
} 

Este método se vuelve falsa porque se está pasando el tipo incorrecto. No estoy seguro de dónde vienen, pero hay varias DLL cargadas dentro de VS que contienen implementaciones del tipo de contexto, pero solo una de ellas se deriva de DbContext, todas las demás se derivan de System.Object. Estos ensamblados de tipos falsos están en mi directorio '% localappdata% \ assembly', por lo que han sido autogenerados por alguna herramienta y cargados en VS.

El error se debe al hecho de que Microsoft.VisualStudio.Web.Mvc.Util.TypeHelper.GetType solo filtra por Type.FullName. para encontrar el Tipo correcto también es necesario filtrar por IsValidContextType().

Ok, algo realmente extraño está sucediendo. Tengo 2 clases parciales para mi clase derivada de DbContext (la mayor parte es autogenerada por una secuencia de comandos .tt, y una parte está hecha a mano). cuando trato de agregar un controlador, VS agrega nuevas propiedades a mi clase parcial, luego construye esa parte de la clase parcial (solo la parte manual, y no usa la clase base). luego carga la DLL que creó de la mitad de la clase de modelo en la memoria, luego falla la comprobación de la clase base anterior.

raro.

línea inferior: intente eliminar las clases parciales del contexto de su modelo, si tiene una.

+0

Esto también significa que no puede tener múltiples niveles de herencia de DBContext. Me sorprendió. Si derivo directamente de DbContext, funciona bien. –

0

Tengo el mismo problema con EF. Estoy usando el VS 2012 El motivo de mi caso fue ... este proceso de generación automática (Andamios) parece no reconocer el concepto de clase parcial.

Utilicé el primer enfoque del modelo y he utilizado la herencia con las entidades. Ex: entidad “B” y “C” se hereda de “A”

Así que en mi generada clase del modelo “DataModelContainer” que se hereda de “DbContext”, No existe una definición de “DbSet” y “DbSet ” es decir: las dos líneas siguientes no estaban allí

public DbSet<B> B { get; set; } 
public DbSet<C> C { get; set; } 

generada‘’clase DataModelContainer I una clase parcial, así que completaron la otra parte, utilizando el concepto de clase parcial. Y esto sería un problema para Andamios.

Mi solución fue, acaba de eliminar la clase parcial que agregué manualmente. Y agregó las definiciones para "DbSet" y "DbSet" en la clase generada automáticamente. El problema con esta solución es que tengo que repetir lo mismo cuando regenere las clases de modelo.

Cuestiones relacionadas