c# - example - entity framework database first español
El controlador de andamios no funciona con Visual Studio 2013 actualización 3 y 4 (11)
No puedo andamiar un controlador (Controlador MVC5 con vistas, utilizando Entity Framework) en Visual Studio 2013 (actualización 3 y 4). El mensaje de error está a continuación:
Hubo un error al ejecutar el generador de código seleccionado:
A configuration for type ''Library.Morthwind.Models.Catgeory'' has already been added. To reference the existing configuration use the Entity<T>() or ComplexType<T>() methods
Creé los modelos seleccionando ''Código de ingeniero inverso primero'' en el menú de herramientas ''Entity Framework Power Tools Beta 4''.
¿Alguna idea sobre qué podría causar este error?
Así es como resolví este problema. Tengo la actualización 4 de Visual Studio 2013.
Yo uso EF Power Tools. Comente todo el DbSet <...> Dentro de OnModelCreating, solo deje el objeto que está andamiando: modelBuilder.Configurations.Add (new SomeTableDataMap ());
En la parte inferior de mi clase de contexto, noté que se creó esto: public System.Data.Entity.DbSet SomeTableDatas {get; conjunto; }
Oh: también puse esto en mi constructor pero es para algo más, this.Configuration.LazyLoadingEnabled = false;
En serio, esto funcionó hoy. He probado todas estas soluciones. Nada funcionó para la Actualización 4. Lo hice funcionar en la Actualización 2 y la Actualización 3 usando soluciones anteriores. Esta es la solución más actualizada por ahora.
He estado teniendo este problema también. La solución de Jeff funciona en algunos casos. Pero a medida que mi DbContext creció con más modelos que necesitaban asignar claves, no pude eliminar los métodos Configurations.Add () porque entonces obtendría errores de que EF no podía encontrar las claves primarias, etc ...
Descubrí que al cambiar mi clase derivada DBContext para usar las propiedades IDbSet en lugar de DbSet, podía generar los controladores y las vistas muy bien. Sin embargo, para mí esto introdujo otro problema, IDbSet no admite los métodos async.
Parece que puedo generar controladores no asíncronos con configuraciones en el lugar o métodos asíncronos sin clases de configuración.
Si las propiedades de contexto son de tipo DbSet, intente cambiarlas a IDbSet. Si no está generando métodos de controlador asíncrono, esto puede funcionar para usted.
Lo resolví agregando un try / catch en el código a la función OnModelCreating dentro de la clase de contexto. Simplemente mantenga la base.OnModelCreating (modelBuilder);
fuera de tu intento / captura
Ninguna de las demás respuestas funcionó para mí. Lo que descubrí fue que el problema solo ocurría al andamiar y agregar configuraciones usando la API Fluent. Entonces, lo que hice fue, en lugar de tener archivos separados, cada uno con una configuración de entidad como esta:
public class ApplicationUserMapConfiguration : EntityTypeConfiguration<ApplicationUserMap>
{
public ApplicationUserMapConfiguration()
{
ToTable("ApplicationUserMap", "Users");
HasKey(c => c.Id);
}
}
Y luego agregando esta configuración al DbContext:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ApplicationUserMapConfiguration());
}
Acabo de agregar toda la configuración dentro de DbContext para cada entidad:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//ApplicationUser
modelBuilder.Entity<ApplicationUser>().HasKey(c => c.Id);
modelBuilder.Entity<ApplicationUser>().ToTable("ApplicationUser", "Usuario");
//Other entities...
}
Ahora puedo andamiar perfectamente. Ya presenté y emití en Mvc GitHub .
Además, si aparece otro mensaje de error que diga:
Hubo un error al ejecutar el generador de código seleccionado: ''Excepción ha sido lanzada por el objetivo de una invocación''.
Debe modificar su constructor DbContext a:
public YourDbContext() : base("YourDbContext", throwIfV1Schema: false) { }
Ninguna de las respuestas de esta publicación funcionó para mí. Manejé este problema creando una nueva clase de contexto a través del botón más en el cuadro de diálogo Agregar andamio de controlador. Una vez que VS creó el controlador y las vistas, simplemente eliminé la clase de contexto creada y cambié el código del controlador generado para usar mi clase de contexto existente.
Importante : Este proceso agregará una nueva cadena de conexión para el nuevo contexto, no olvide eliminarlo también.
Obtuve un error diferente al intentar andamiar un controlador con acciones y vistas de CRUD. En mi caso, estaba diciendo:
"Hubo un error al ejecutar el generador de código seleccionado. La instancia del objeto no se configuró en una instancia del objeto".
El problema era difícil de encontrar: creé una tabla en SQL Server
pero olvidé establecer la Primary Key
para la tabla. Configurar la Primary key
y actualizar el archivo .edmx
Entity Framework resolvió el problema.
Espero eso ayude.
Solución simple que funcionó para mí (después de probar muchas otras soluciones sugeridas aquí y otros lugares en vano ...).
En el diálogo de andamios acabo de agregar un nuevo DataContext, por ejemplo TempContext. Todos los andamios funcionaron como se esperaba y luego pude simplemente mover el código generado en TempContext a mi DbContext original y renombrar TempContext en los controladores generados al DbContext original.
También tuve el mismo problema y cambiar mi clase de contexto para usar IDbSet me permitió usar el andamio con éxito para crear un nuevo controlador. Pero como no quería renunciar a los métodos asíncronos, cambié el contexto para usar DbSet y me funcionó.
Tuve el mismo problema hoy.
Agregué una configuración personalizada para una de mis clases de modelo para agregar una relación usando la API fluida. Esto fue especificado en mi clase dbContext
en la anulación OnModelCreating
usando lo siguiente:
modelBuilder.Configurations.Add(new OrderConfiguration());
Al comentar la línea anterior, el andamio del Controller
ejecutó como se esperaba.
La actualización 2 de VS 2013 tuvo un problema con esto y el andamio generó un error inútil sin más información. En la actualización 3 instalada, proporcionó detalles suficientes para rastrear el problema subyacente.
Jeff.
Ya hay varias soluciones temporales publicadas para este problema. Y en este comentario, trataré de proporcionar el tema subyacente por qué esto puede estar fallando. [Con la esperanza de que la gente tome conciencia de la causa raíz]
Digamos que tiene un DbContext (para ser específico, clase hija de DbContext) en su aplicación, y está tratando de usar una clase de modelo (digamos Model) y los controladores / vistas DbContext y andamios.
Supongo que el DbContext no tenía una propiedad "DbSet <Model> Models {get; set;}", pero el DbSet se agregó a DbContext usando el código en el método OnModelCreating.
En el caso anterior, el andamio primero intenta detectar la propiedad DbSet en DbContext (solo por reflexión, para que no detecte si OnModelCreating tiene código para agregar el DbSet) y dado que no es así, el andamio agrega una propiedad DbSet al DbContext y luego intenta andamio usando ese DbContext, sin embargo cuando ejecutamos el andamio, creamos una instancia de DbContext y también llamamos a OnModelCreating, y en ese punto, el andamio falla porque hay múltiples tipos de DbSet con el mismo modelo en el DbContext (uno agregado por un andamio y otro configurado en código en OnModelCreating).
[Esto sucede no solo para el modelo que se está utilizando, sino también para los modelos relacionados en ese modelo, el andamio agrega propiedades DbSet para todos los modelos relacionados]
[Además, uno no ve el DbSet agregado después de que el andamiaje está listo porque el andamiaje revierte cualquier cambio si la operación no se completó con éxito, como mencionó Jeff, el mensaje de error fue pobre al principio y se mejoró para darle alguna pista al usuario pero todavía no está muy claro lo que está pasando]
Este es un error en el andamiaje, un simple trabajo sería usar la propiedad DbSet en DbContext para todos los modelos relacionados de su clase de modelo en lugar de configurarlos en OnModelCreating.
el mío fue arreglado así:
public virtual DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//--> EntityTypeConfiguration<Your Model Configuration>
modelBuilder.Configurations.Add(new EntityTypeConfiguration<CategoryMapping>());
base.OnModelCreating(modelBuilder);
}
No olvide Ctrl + Shift + B para compilar su código (no estoy seguro de una solución única, pero como la mía está en otro proyecto en la misma solución, primero debe compilarse)