c# - name - Entity Framework Exception: nombre de objeto no válido
el nombre de objeto dbo aspnetusers no es válido (6)
La base de datos LibraryReservationSystem ya es una base de datos existente. No tiene mesas. Espero que EF cree las tablas.
Eso no es correcto. Si la base de datos existe, EF no crea ninguna tabla en esta base de datos. EF puede crear la base de datos si no existe. Ese es el inicializador de base de datos predeterminado CreateDatabaseIfNotExists
que se aplica si no lo cambia explícitamente. Puede seleccionar otros dos inicializadores: DropCreateDatabaseAlways
o DropCreateDatabaseIfModelChanges
. Pero ninguno de ellos solo creará tablas en una base de datos existente, sino que eliminará la base de datos completamente y la creará desde cero, incluidas todas las tablas.
Qué puedes hacer:
- O bien elimine la base de datos manualmente (por ejemplo, en SSMS), luego EF creará una nueva que incluye las tablas
- O use el inicializador
DropCreateDatabaseAlways
una vez para que EF cree la base de datos, incluidas las tablas, luego elimine el inicializador nuevamente -
O si no puede eliminar la base de datos por cualquier motivo, escriba el código SQL en el método(incorrecto, gracias al comentario de Mark Stafford)Seed
que agrega las tablas a la base de datos - O use Code-First Migrations (EF> = 4.3) para agregar nuevas tablas a una base de datos existente cuando haya agregado nuevas entidades.
Estoy tratando de crear la base de datos utilizando el enfoque de Código Primero. Cuando ejecuto el siguiente código, obtengo la siguiente excepción. ¿Hay algo mal en los campos que he definido? ¿Cómo podemos superar esto?
Excepción
Se ha producido un error al actualizar las entradas. Vea la excepción interna para más detalles.
Excepción interna :
"Nombre de objeto inválido ''dbo.Dinners''.
Nota : No tengo una tabla de este tipo (Cenas) en la base de datos. Se supone que el código crea las tablas. Acabo de dar una cadena de conexión para identificar el servidor como se menciona en el Código de EF Primero: No se puede conectar a SQL Server . ¿Debo cambiar la cadena de conexión?
Cadena de conexiones:
string connectionstring = "Fuente de datos =.; Catálogo inicial = LibraryReservationSystem; Integrated Security = True; Connect Timeout = 30";
La base de datos LibraryReservationSystem ya es una base de datos existente. No tiene mesas. Espero que EF cree las tablas.
La cadena de conexión que copié de una aplicación SQL LINQ 2 en funcionamiento. ¿Necesito hacer algún cambio para suministrárselo a EF?
ACTUALIZAR
Cuando incluí el siguiente código, la excepción se modificó. Ahora dice: "Nombre de objeto no válido ''dbo.Dinner''.". Ahora se queja de la mesa de la cena; No cenas de mesa.
protected override void OnModelCreating(DbModelBuilder modelbuilder)
{
modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
CÓDIGO original
static void Main(string[] args)
{
string connectionstring = "Data Source=.;Initial Catalog=LibraryReservationSystem;Integrated Security=True;Connect Timeout=30";
using (var db = new NerdDinners(connectionstring))
{
var product = new Dinner { DinnerID = 1, Title = 101 };
db.Dinners.Add(product);
int recordsAffected = db.SaveChanges();
}
}
using System.Data.Entity;
namespace LijosEF
{
public class Dinner
{
public int DinnerID { get; set; }
public int Title { get; set; }
}
public class RSVP
{
public int RSVPID { get; set; }
public int DinnerID { get; set; }
public virtual Dinner Dinner { get; set; }
}
//System.Data.Entity.DbContext is from EntityFramework.dll
public class NerdDinners : System.Data.Entity.DbContext
{
public NerdDinners(string connString): base(connString)
{
}
public DbSet<Dinner> Dinners { get; set; }
public DbSet<RSVP> RSVPs { get; set; }
}
}
REFERENCIA
Acabo de encontrar exactamente el mismo problema: ya había creado mi base de datos en un cuadro de SQL de desarrollo dentro de nuestra red que necesita autenticación SQL.
Cuando ejecuté mi aplicación, no se crearon tablas. Encontré este artículo asombroso pero sencillo sobre la creación de una Estrategia de inicialización de base de datos de Code First que primero verifica si existe la base de datos y luego ejecuta un script en la base de datos para crear las tablas.
Como se indica en el artículo, preste atención a que cuando se implemente una estrategia de este tipo, cada vez que la aplicación se reinicie, se volverán a crear todas las tablas de la base de datos. Esta estrategia solo debe ejecutarse una vez.
Pero tu ya lo sabías.
Como entendí, está esperando que el código cree la base de datos automáticamente en función de la descripción de sus entidades. Pero esto no sucederá a menos que cree DB explícitamente. Consulte el siguiente enlace http://www.simple-talk.com/dotnet/.net-framework/entity-framework-4460---learn-to-create-databases-from-the-model/ y este tutorial en Código de EF primero: http://codefirst.codeplex.com/
Como sugiere el error, no tiene una tabla llamada Dinners
dentro de su base de datos.
¿Estás usando nombres de tablas individuales o plurales? ¿Cena o cenas?
La respuesta de @ Slauma es la correcta: las tablas se crean en la inicialización. Probablemente sea más fácil simplemente eliminar la base de datos y dejar que EF la cree (si deja la cadena de conexión tal como está, creará una base de datos llamada LibraryReservationSystem en la máquina local; probablemente deba especificar un nombre de host explícito si va a usar) la cadena de conexión en la configuración en este punto).
Necesitarías algo como:
public class NerdDinnersInitializer : DropCreateDatabaseIfModelChanges<NerdDinners> { }
Y también necesitarías establecer el inicializador en tu método principal:
Database.SetInitializer(new NerdDinnersInitializer());
Palabra para el sabio: NUNCA despliegue una aplicación con un inicializador como el anterior. Puede ver esta publicación del blog sobre cómo controlar los inicializadores a través del archivo de configuración para obtener más detalles sobre cómo controlar esto en aplicaciones de producción.
Una vez que haya diseñado las entidades, puede hacer clic con el botón derecho en el área de trabajo del archivo EDMX y seleccionar "Generar base de datos desde el modelo ...". Haga clic hasta que tenga un script en su ventana. Para ese script, tendrá que eliminar el paso de creación de la base de datos (si está allí) e ir directamente a CREAR TABLA ...
Copia-pega y ejecuta en cualquier DB que tengas. Es posible que tenga que ajustar el script para un RDBMS específico.