J'essaie de créer une base de données en utilisant l'approche Code First. Lorsque j'exécute le code suivant, j'obtiens l'exception suivante. Y a-t-il quelque chose qui cloche dans les champs que j'ai définis? Comment pouvons-nous surmonter cela?
Exception:
Une erreur s'est produite lors de la mise à jour des entrées. Voir l'exception interne pour plus de détails.
Exception interne:
"Nom d 'objet invalide' dbo.Dinners '.
Note: Je n'ai pas de table de ce type (Dinners) dans la base de données. Le code est censé créer les tables. Je viens de donner une chaîne de connexion pour identifier le serveur comme indiqué dans Code EF en premier: Impossible de se connecter à SQL Server . Devrais-je changer la chaîne de connexion?
Connections String:
string connectionstring = "Source de données = .; Catalogue initial = LibraryReservationSystem; Sécurité intégrée = True; Délai de connexion = 30";
La base de données LibraryReservationSystem est déjà existante. Il n'y a pas de tables. Je m'attends à ce que EF crée les tables.
La chaîne de connexion que j'ai copiée à partir d'une application SQL LINQ 2 opérationnelle. Dois-je apporter des modifications pour fournir à EF?
METTRE À JOUR
Lorsque j'ai inclus le code suivant, l'exception a été modifiée. Maintenant, il indique "Nom d'objet non valide 'dbo.Dinner'.". Il se plaint maintenant de Dinner table; pas table à manger.
protected override void OnModelCreating(DbModelBuilder modelbuilder)
{
modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
CODE 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; }
}
}
R&EACUTE;F&EACUTE;RENCE
La base de données LibraryReservationSystem est déjà existante. Il n'a pas de tables. Je m'attends à ce que EF crée les tables.
Ce n'est pas correct Si la base de données existe, EF ne crée aucune table dans cette base de données. EF peut créer la base de données si elle n’existe pas. C'est l'initialiseur de base de données par défaut CreateDatabaseIfNotExists
qui est appliqué si vous ne le modifiez pas explicitement. Vous pouvez sélectionner deux autres initialiseurs: DropCreateDatabaseAlways
ou DropCreateDatabaseIfModelChanges
. Mais aucun de ceux-ci ne créera des tables dans une base de données existante, mais supprimera complètement la base de données et la créera à partir de zéro, y compris toutes les tables.
Que pouvez-vous faire:
DropCreateDatabaseAlways
initializer une fois pour laisser EF créer la base de données, y compris les tables, puis supprimez à nouveau l'initialiseurSeed
qui ajoute les tables à la base de donnéesLa réponse de @ Slauma est la bonne: les tables sont créées à l'initialisation. Il est probablement plus simple de supprimer la base de données et de laisser EF le créer (si vous laissez votre chaîne de connexion telle quelle, elle créera une base de données appelée LibraryReservationSystem sur la machine locale; vous devrez probablement spécifier un nom d'hôte explicite si vous souhaitez utiliser la chaîne de connexion dans la configuration à ce stade).
Vous auriez besoin de quelque chose comme:
public class NerdDinnersInitializer : DropCreateDatabaseIfModelChanges<NerdDinners> { }
Et vous devez également définir l’initialiseur dans votre méthode Main:
Database.SetInitializer(new NerdDinnersInitializer());
Word to the wise: NE JAMAIS déployer une application avec un initialiseur comme celui ci-dessus. Vous pouvez voir cet article de blog sur la façon de contrôler les initialiseurs via le fichier de configuration pour plus de détails sur la manière de contrôler cela dans les applications de production.
Je viens de rencontrer exactement le même problème: j'avais déjà créé ma base de données sur une boîte de développement SQL au sein de notre réseau nécessitant une authentification SQL.
Lorsque j'ai exécuté mon application, aucune table n'a été créée. J'ai trouvé cet article simple mais génial sur la création d'une stratégie d'initialiseur de code de base de données d'abord qui vérifie d'abord si la base de données existe, puis exécute un script sur la base de données pour créer les tables.
Comme indiqué dans l'article - faites attention, quand une telle stratégie est déployée, chaque fois que l'application redémarre, toutes les tables de la base de données seront recréées! Cette stratégie ne doit être exécutée qu'une seule fois.
Mais vous le saviez déjà.
Une fois que vous avez conçu vos entités, vous pouvez cliquer avec le bouton droit de la souris sur l'espace de travail du fichier EDMX et sélectionner «Générer une base de données à partir d'un modèle ...». Cliquez jusqu'à ce que vous ayez un script dans votre fenêtre. Pour ce script, vous devrez supprimer l'étape de création de la base de données (si elle existe) et passer directement à CREATE TABLE ...
Copier-coller et exécuter dans la base de données que vous avez. Vous devrez peut-être ajuster le script pour un SGBDR spécifique.
Si j'ai bien compris, vous vous attendez à ce que le code crée automatiquement une base de données en fonction de la description de vos entités. Mais cela ne se produira que si vous créez explicitement une base de données. Veuillez vérifier le lien suivant http://www.simple-talk.com/dotnet/.net-framework/entity-framework-4460---learn-to-create-databases-from-the-model/ et ce tutoriel sur EF codefirst: http://codefirst.codeplex.com/
Comme le suggère l'erreur, vous ne disposez pas d'une table appelée Dinners
dans votre base de données.
Utilisez-vous des noms de table simples ou pluriels? i.e. Dîner ou dîners?