web-dev-qa-db-fra.com

Cadre d'entité

J'essaie de faire ce tutoriel http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part4-cs mais au lieu d'utiliser l'édition compacte de SQL Server, j'utilise une installation complète sur ma machine locale. D'après ce que j'ai lu dans ce tutoriel, Entity Framework est censé créer les tables à partir des objets que j'ai définis. Mon problème est que le nom d'objet non valide dbo.movies continue à apparaître lorsque j'exécute le projet. J'ai finalement réussi à l'exécuter en créant la table moi-même, donc je connais la chaîne de connexion et tout était correct.

Ma question est la suivante: est-il possible de générer des tables à partir d’objets créés en C # et si oui comment?

12
Pieces

est-il possible de générer des tables à partir d'objets créés en C #?

Oui c'est possible. Avez-vous créé la base de données manuellement dans Management Studio avant d'exécuter le code? Cela pourrait être votre problème. Avec Code First, la convention par défaut consiste à créer la base de données si elle n'existe pas déjà. Si la base de données existe déjà (même sans les tables), elle utilisera simplement la base de données existante (mais elle n'essaiera pas de créer les tables).

Vous pouvez soit supprimer la base de données et essayer de réexécuter le code pour voir s'il la créera pour vous, soit insérer la ligne suivante dans Global.asax:

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

Une fois que cela a fonctionné, je suggère de changer cette ligne en:

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

Ces espaces de noms sont définis dans System.Data.Entity

La classe DbContext expose également une propriété de base de données qui définit les méthodes utiles suivantes:

Delete()
Create()
CreateIfNotExists()

Donc, si vous avez défini votre classe comme suit:

public class MyContext : DbContext {}

Vous pouvez construire une instance comme ceci:

MyContext db = new MyContext();
db.Database.Delete();
db.Database.Create();
22
Dismissile
ModelContext.Database.EnsureCreated();
1
Ronnie

Je ne sais pas si c'est casher, mais en utilisant le code d'abord EF, quand j'utilise AddRange, EF crée généralement toutes les tables que j'ai définies. Je souhaitais conserver la base de données car je souhaitais conserver d'autres tables entre les exécutions de l'application. J'ai découvert que les tables ne seraient pas recréées après leur suppression si je ne supprimais pas également la table EF créée appelée __MigrationHistory.

Une fois que j'ai supprimé cette table, EF recréerait les tables sans avoir à recréer la base de données.

Cette approche n’est peut-être pas souhaitable en production, mais pour mes besoins en développement, cela a résolu mon problème. Peut-être que cela aidera quelqu'un d'autre.

0
John

Si vous créez un DataContext Linq-to-Sql, vous pouvez injecter la structure directement dans votre base de données avec:

DbDataContext db = new DbDataContext(connectionString);
db.CreateDatabase();
0
kyjan

Vous pouvez utiliser la bibliothèque FenixRepo (également disponible sous la forme paquet nuget ) pour créer une table particulière, qui fait partie de vous Context. Tout d’abord, vous devez appeler une fois, au démarrage, la méthode staticInitialize, où le premier argument est une méthode fabrique, qui retourne une instance de votre Context et le second est une instance de Configurationclass. Il préparera des scripts SQL pour toutes vos tables, enregistrés à votre Context. Dans le cas d'ASP.NET MVC, il est judicieux de coller ce code dans Global.asax:

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

Vous pouvez ensuite créer une table du type souhaité MyTable de cette manière simple:

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

repo.CreateTable();

De plus, si votre table est répartie entre plusieurs migrations et que rien ne correspond à d’autres tables, vous pouvez spécifier ces migrations (c'est-à-dire les noms des classes du dossier Migrations) via FenixAttribute et elles seront utilisées comme source de scripts SQL, qui être utilisé pour la création de table:

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

Sans cet attribut, la bibliothèque utilisera default scripts. Il est toujours préférable de spécifier les migrations, car sinon, il n'est pas garanti que tous les index seront créés. Vous pouvez également inclure dans vos migrations du code personnalisé, qui ne sera pas exécuté dans le cas de default solution.

Library est compatible et testé avec EF 6.1.3 dans le cas de MS SQL.

0
Slava Utesinov