2012-03-26 13 views
10

Estoy tratando de hacer este tutorial http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part4-cs pero en lugar de usar la edición compacta de SQL Server estoy usando una instalación completa en mi máquina local. La forma en que leo este tutorial es que Entity Framework se supone que debe crear las tablas a partir de los objetos que he definido. Mi problema es que sigo obteniendo el nombre de objeto no válido dbo.movies, cuando ejecuto el proyecto. Finalmente logré que se ejecutara creando la tabla yo mismo, así que conozco la cadena de conexión y todo fue correcto.Auto Crear tablas de base de datos de objetos, Entity Framework

Mi pregunta es, ¿es posible generar tablas a partir de objetos creados en C# y, en caso afirmativo, cómo?

Respuesta

19

¿es posible generar tablas a partir de objetos creados en C#?

Sí es posible. ¿Creó que creó la Base de datos manualmente en Management Studio antes de ejecutar el Código? Ese podría ser tu problema. Con Code First, la convención predeterminada es crear la base de datos si aún no existe. Si la base de datos ya existe (incluso sin las tablas), simplemente usará la base de datos existente (pero no intentará crear las tablas).

Usted puede eliminar la base de datos y tratar de ejecutar el código de nuevo para ver si va a crear para usted o poner la siguiente línea en Global.asax:

Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContextHere>()); 

Una vez que se ha ejecutado entonces yo sugerir cambiar esa línea a:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourDbContextHere>()); 

Estos espacios de nombres se definen en System.Data.Entity

La clase DbContext también expone a datos propiedad de la base que define los siguientes métodos útiles:

Delete() 
Create() 
CreateIfNotExists() 

Así que si ha definido la clase de este modo:

public class MyContext : DbContext {} 

Es posible construir una instancia de este modo:

MyContext db = new MyContext(); 
db.Database.Delete(); 
db.Database.Create(); 
+0

Hmm, ¿qué se supone que debo poner en la cadena de conexión si no hay una base de datos inicial para que se conecte? Simplemente eliminé el artículo del catálogo inicial y recibí el mismo error de nombre de objeto inválido 'dbo.Movies'. – Pieces

+0

Connection String le dice dónde crear la base de datos. No tiene que existir. Detectará que no existe y luego intentará crearlo si no existe. Siempre que tenga los permisos correctos, todo se creará bien. Creo que si eliminas la base de datos y conservas la misma cadena de conexión, todo terminará funcionando de la manera que deseas. – Dismissile

+0

¡Oh, increíble, muchas gracias! Una última pregunta sobre qué método recomendaría poner el Database.SetInitializer. Obtuve un error que decía que no se podía quitar la base de datos porque estaba en uso. Presumiría por la aplicación de sí mismo. Gracias de nuevo, mi amigo y yo pasamos mucho tiempo buscando tratando de resolver el problema y nunca hubiéramos adivinado que era porque ya no deberíamos crear la base de datos. – Pieces

0

Si crea un DataContext Linq-to-Sql puede inyectar la estructura directamente en su base de datos con:

DbDataContext db = new DbDataContext(connectionString); 
db.CreateDatabase(); 
+1

Está usando Entity Framework DbContext, no Linq-to-SQL – Dismissile

0

No sé si esto es kosher, pero usando EF con código primero, cuando uso AddRange, EF generalmente creará todas las tablas que he definido. Quería mantener la base de datos porque hay otras tablas que quería mantener entre ejecuciones de aplicaciones. Descubrí que las tablas no se volverían a crear después de que se eliminaran si no eliminaba también la tabla EF creada llamada __MigrationHistory.

Una vez que eliminé esta tabla, EF recrearía las tablas sin tener que volver a crear la base de datos.

Esto puede no ser un enfoque recomendable en la producción, pero para mis necesidades de desarrollo, esto resolvió mi problema. Quizás ayude a alguien más.

0

Puede usar la biblioteca FenixRepo (también disponible como nuget package) para crear una tabla particular, que es una parte de usted Context.En primer lugar, debe llamar una vez, al inicio staticInitialize método, donde el primer argumento es un método de fábrica, que devuelve instancia de su Context y el segundo es una instancia de Configurationclass. Preparará secuencias de comandos SQL para todas sus tablas, registradas en su Context. En caso de ASP.NET MVC es una buena decisión para pegar este código en Global.asax:

FenixRepositoryScriptExtractor.Initialize(() => new Context(), new Configuration()); 

continuación, puede crear la tabla de tipo deseado MyTable esta sencilla manera:

var repo = new FenixRepositoryCreateTable<MyTable>(); 
//or repo = new FenixRepository<MyTable>(); 

repo.CreateTable(); 

Además, si su tabla se extiende entre varias migraciones y no tienen nada que corresponda a otras tablas, puede especificar estas migraciones (es decir, nombres de clases de la carpeta Migrations) a través del FenixAttribute, y se usarán exactamente como fuente de scripts SQL, que se usarán para la creación de tablas:

[Fenix(nameof(Initial), nameof(MyTableFirstMigration), nameof(MyTableSecondMigration))] 
public class MyTable 
{ 
    //some stuff 
} 

Sin este atributo, la biblioteca utilizará scripts predeterminados. Siempre es mejor especificar migraciones, porque de lo contrario no se garantiza que se crearán todos los índices y también en sus migraciones puede incluir algún código personalizado, que no se ejecutará en el caso de solución predeterminada.

La biblioteca es compatible y se prueba con EF 6.1.3 en el caso de MS SQL.

-1
ModelContext.Database.EnsureCreated(); 
+0

pls explique su pregunta. –

Cuestiones relacionadas