scaffolding - parte - error al ejecutar el generador de codigo seleccionado no se pueden recuperar metadatos
Fallo del andamio del controlador VS 2013 para el modelo ApplicationUser(no se admiten varios conjuntos de objetos por tipo) (9)
Aquí está la solución más simple. Cuando agrega / scaffold una vista (lista) basada en ApplicationUser como modelo, VS2013 ADDS lo siguiente al archivo IdentityModels.vb o .cs .:
Propiedad pública ApplicationUsers As System.Data.Entity.DbSet (Of ApplicationUser)
Simplemente elimine esta propiedad y el problema desaparece.
En un proyecto VS 2013 RTM, MVC 5 con EF 6, traté de armar un controlador basado en ApplicationUser (predeterminado con autenticación de cuentas individuales). Tanto ApplicationUser
como IdentityUser
se asignan a una tabla de usuarios. El asistente abre el archivo de contexto para su edición e intenta agregar un nuevo conjunto de bases de datos para ApplicationUser (ApplicationUsers) y luego falla con este error:
Unable to retrieve metadata for ApplicationUser. Multiple object sets per type are not supported. The object sets ApplicationUsers and Users can both contain instances of type ApplicationUser
Unable to retrieve metadata for ApplicationUser. Multiple object sets per type are not supported. The object sets ApplicationUsers and Users can both contain instances of type ApplicationUser
La solución no tiene ninguna referencia o instancia de ApplicationUsers
.
¿Es este un problema conocido? ¿Se puede ejecutar el andamio utilizando la línea de comandos con opciones (de PMC)? Nota: los andamios también agregan un conjunto de db adicional a la clase de contexto si especifico un modelo que hace referencia a ApplicationUser (la aplicación funciona si la elimino y arreglo las referencias en el controlador de generación).
Cuando use los andamios para generar control, vs insertará automáticamente 1 línea en el contexto de su base de datos
public System.Data.Entity.DbSet<...API.Models.ApplicationUser> ApplicationUsers { get; set; }
Simplemente borra esa línea, y en tu controlador. cambiar db.ApplicationUsers
a db.Users
Guau. Estoy realmente sorprendido de que nadie haya llegado a la raíz de esto, y en su lugar, solo están recomendando soluciones alternativas.
IdentityDbContext
ya contiene una propiedad:
`public virtual IDbSet<TUser> Users { get; set; }
Cuando subclase IdentityDbContext
para crear su propio contexto específico de la aplicación, debe especificar qué clase satisface el genérico TUser
. El valor predeterminado es:
public ApplicationDbContext : IdentityDbContext<ApplicationUser>
Lo que entonces significa que funcionalmente ya tiene una propiedad a través de la herencia en la forma de:
public IDbSet<ApplicationUser> Users { get; set; }
Si luego agrega otra propiedad a su contexto específico de la aplicación tal como:
public DbSet<ApplicationUser> ApplicationUsers { get; set; }
Ahora tiene la misma entidad rastreada por dos DbSet
s, y obtiene ese error. ¿La solución? Simplemente no agregue su propio DbSet
para ApplicationUser
. No hay necesidad de cambiar el nombre o anular nada.
Lea los problemas y soluciones anteriores. Mi mensaje de error fue:
No se admiten varios conjuntos de objetos por tipo. Los conjuntos de objetos ''ApplicationUsers'' y ''Users'' pueden contener instancias del tipo ''DataLayerIdentity.Models.ApplicationUser''
Sospecho que el error se creó cuando estaba jugando y armé el modelo: ApplicationUser en un nuevo controlador.
Resuelto eliminando lo siguiente de: ApplicationDbContext.cs
public System.Data.Entity.DbSet<DataLayerIdentity.Models.ApplicationUser> ApplicationUsers
{
get;
set;
}
No se hicieron otros cambios para resolver el problema. Espero que esto ayude a alguien.
Lo que también puede hacer: crear un controlador vacío y agregar el código para el DataContext usted mismo
protected ApplicationDbContext db { get; private set; }
public HomeController() : this(new ApplicationDbContext())
{
}
public HomeController(ApplicationDbContext db)
{
this.db = db;
}
Luego cree sus métodos como Índice, Crear, etc., y cree las vistas haciendo clic con el botón derecho y "Agregar vista ..." para cada uno. Scaffold sus vistas con la lista, crear, cualquier plantilla que sea apropiada y elegir el ApplicationUser como modelo.
Importante: elimine la entrada en "Clase de contexto de datos", o obtendrá un error similar nuevamente. Pero si deja la "clase de contexto de datos" vacía, el andamiaje de la vista funcionará bien.
Pasé más de un día resolviendo este problema ... (((Cambiar la clase es solo una solución. La solución correcta es eliminar esta línea de ApplicationContext (IdentityModels.cs). No sé cuándo se insertó en mi código.
System.Data.Entity.DbSet ApplicationUsers {get; conjunto; }
Los usuarios se administran en algún lugar dentro, debería haber TABLAS DEFINIDAS POR EL USUARIO AQUÍ SOLAMENTE. Significa que esta línea incorrecta es la segunda aparición, y esta es la razón del mensaje de error "Conjuntos de objetos múltiples".
Después de eliminar esta línea y compilar, recibí varios mensajes de error en mi código de vista generado automáticamente, ya que ya hacía referencia a la declaración incorrecta. Puede volver a crear la vista o corregir el código manualmente, simplemente cambie el nombre de las referencias erróneas a ApplicationUser para corregir al Usuario (correctamente definido en algún lugar, no en IdentityModels.cs)
Al intentar encontrar la solución, también dañé mis migraciones, así que tuve que iniciar la migración de las estructuras de datos a la base de datos desde cero.
Ahora estoy completamente recuperado de este problema y el problema de casi ROOT está claro. Desafortunadamente, el problema raíz es probablemente un error en VS2013, que crea esa línea adicional incorrecta.
Pero de todos modos, sigue sonriendo. Enfrentar estos errores no es nada comparado con la programación en Java :)
Si está intentando crear un ApplicationUsersController, siga estos pasos.
Eliminar esta línea de IdentityModels.cs
public System.Data.Entity.DbSet<Project.Models.ApplicationUser> ApplicationUsers { get; set; }
Construir el proyecto
control + shift + b
Generar el controlador
Right click on the ''Controllers'' folder. Add > Controller MVC Controller with views, using Entity Framework Model Class: ApplicationUser Add
Vuelva a IdentityModels.cs y elimine esta línea OTRA VEZ
public System.Data.Entity.DbSet<Project.Models.ApplicationUser> ApplicationUsers { get; set; }
Construir el proyecto
control + shift + b
Cambie las llamadas a la base de datos de ApplicationUsers a Users en ApplicationUsersController.cs
control + f to bring up ''Find and Replace'' Click ''Replace in files'' Find what: db.ApplicationUsers Replace with: db.Users Replace All
Pulsa play y cruza los dedos :)
Solucioné el problema eliminando DbSet del contexto y luego cambiando las referencias en el controlador de ApplicationUsers a Users. Funcionó, pero ahora no veo ningún punto en los usuarios de andamios. Muchas cosas tienen que ser mantenidas en el nivel superior y simplemente no funciona bien. Ahora sé que los modelos de vista y el repositorio son el camino que quiero seguir.
Versión Corta: Renombra tu clase ApplicationUser a Usuario.
He estado encontrando este problema durante aproximadamente un mes sin ninguna suerte ... ¡hasta ahora!
Inicialmente, pensé que era un problema de vista previa, pero después de persistir en el RTM junto con las últimas bibliotecas, me sentí increíblemente molesto, ya que este problema persistía también en las Migraciones.
Sin embargo, IdentityDbContext, según el mensaje de error, parece estar creando dos DbSets: ApplicationUsers y Usuarios. Solo queremos usuarios cuando miramos el código fuente:
public class IdentityDbContext<TUser> : DbContext where TUser : Microsoft.AspNet.Identity.EntityFramework.IdentityUser
{
...
public virtual IDbSet<TUser> Users { get; set; }
...
}
A partir de esto, nosotros (y el motor de andamiaje y el motor de migración) solo deberíamos ver "Usuarios", no "Usuarios de aplicaciones".
Para corregir esta situación, deberá ajustar la clase de su aplicación para tener en cuenta este error bastante extraño. Simplemente cambie el nombre de su clase ApplicationUser a Usuario:
using Microsoft.AspNet.Identity.EntityFramework
...
public class ApplicationUser : IdentityUser
{
Your Stuff
}
A:
using Microsoft.AspNet.Identity.EntityFramework
...
public class User: IdentityUser
{
Your Stuff
}
Intenta hacer andamio de nuevo. Si recibe otro error a lo largo de las líneas de la clase, no puede encontrarlo, guarde su proyecto, cierre VS2013, vuelva a abrir VS2013, cargue el proyecto, vuelva a compilar el proyecto y, por último, intente armar un andamio. El objeto IdentityDBContext ya no debería estar creando un objeto DBSet "ApplicationUsers" ficticio que haga que tanto las Migraciones de Entidades como los Andamios emitan estos errores.
¡Espero que esto ayude!
PD Cualquier asignación realizada no debería afectar este problema, por lo que debería poder asignarse a la misma tabla si así lo desea.
EDITAR: Si recibe más problemas, deshaga el cambio de nombre. Me encontré con algunos problemas (más andamios y errores de consulta), y después de volver a ApplicationUser
, esos problemas desaparecieron y el problema anterior no volvió a ocurrir. Sólo un heads up.