7

Ich habe eine Reihe von Problemen, die versuchen, (Code-zuerst) Migrationen für meine SQL Server Compact 4.0-Datenbank für meine Desktop-App zu ermöglichen.SQL Server CE-Code Erste Migrationsprobleme

Enable-Migrations funktioniert und das Verzeichnis Migrations erstellt wird. Danach, wenn ich versuche, Add-Migration InitialMigration laufen zu lassen, bekomme ich:

Zugriff auf die Datenbankdatei ist nicht erlaubt. [1914 Dateiname = Logo.sdf, SeCreateFile]

Dies ist das erste Problem ist, aber ich löste es von Visual Studio als Administrator ausgeführt wird ... nicht wie die Lösung und weiß auch nicht, wenn Später in der Produktion wird es funktionieren, ohne dass die App im Admin-Modus ausgeführt wird. Ich lasse dieses Problem beiseite jetzt ...

Meine Verbindungszeichenfolge:

<add name="LogoContext" 
    connectionString="Data Source=Logo.sdf" 
    providerName="System.Data.SqlServerCE.4.0"/>` 

So nach Add-Migration InitialMigration in Administrator-Modus ausgeführt wird erhalte ich eine leere Migration ... das ist ok. Dann habe ich die Migration löschen und eine neue Klasse hinzuzufügen:

using System; 
using System.Collections.Generic; 

public class Blog 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
} 

ich einen Verweis auf die Kontextklasse:

public class LogoContext : DbContext 
{ 
    public DbSet<Word> Words { get; set; } 
    public DbSet<User> Users { get; set; } 
    public DbSet<Blog> Blogs { get; set; } 
} 

Dann Add-Migration InitialMigration laufen wieder und erhalten:

public partial class InitialMigration : DbMigration 
{ 
    public override void Up() 
    { 
     CreateTable(
      "dbo.Blogs", 
      c => new 
       { 
        ID = c.Int(nullable: false, identity: true), 
        Content = c.String(maxLength: 4000), 
       }) 
      .PrimaryKey(t => t.ID); 
    } 

    public override void Down() 
    { 
     DropTable("dbo.Blogs"); 
    } 
} 

Nach dem Laufen Update-Database Ich sehe:

Applying code-based migrations: [201304211225255_InitialMigration]. 
Applying code-based migration: 201304211225255_InitialMigration. 
Running Seed method. 

Jetzt erscheint das Problem - in meinem Server Explorer untersuche ich die Datenbank Logo.sdf und es nicht enthält die Tabelle Blogs! Ich versuche auch diesen Code aus meiner Anwendung auszuführen:

var db = new LogoContext(); 
db.Posts.Add(new Blog { Title= "moo" }); 
db.SaveChanges(); 

zu überprüfen, ob vielleicht mein Server-Explorer nicht angezeigt wird auf den Tisch .. aber ich erhalte eine Ausnahme:

Die angegebene Tabelle nicht existieren. [Blogs]

So sind die Wanderungen offensichtlich nicht auf meine Logo.sdf Datei angelegt werden :(

Wenn ich die Verbindungszeichenfolge von app.config, die Verbindung zu einer lokalen Instanz von SQL Server Express entfernen angenommen. Und es funktioniert es einwandfrei !! Wenn ich die Datenbank mit SQL Server Management Studio zu untersuchen, habe ich den neuen Blogs Tisch und auch eine Systemtabelle über Migrationen für Metadaten sehen ...

ein weiteres kleines Stück Information:

Wenn ich versuche, Update-Database erneut auszuführen, bekomme ich "Keine ausstehenden code-basierten Migrationen." Und das sagt mir, dass einige Daten gespeichert werden, schließlich ... zumindest einige Metadaten über Migrationen, aber immer noch kann ich ' Diese Tabelle finden Sie im Server-Explorer.

Ich verwende VS 2012 und EF 5.0.

Bitte helfen Sie mir, dies zu verstehen ... Es sieht für mich aus, dass etwas ernsthaft falsch ist, weil es nur mit SQL Server Express-Instanz funktioniert, aber nicht mit SQL Server CE 4.0. Danke ((

david

+2

Ich schlage vor, Sie beginnen mit einem vollständigen Pfad zu Ihrer Datenbank-Datei in Ihrer Verbindungszeichenfolge, meine Vermutung ist, Sie haben mehrere Kopien der Datenbankdatei, zum Beispiel in Ihrem bin/debug-Ordner – ErikEJ

+0

Hmm ich dachte auch darüber nach, aber ich stellte sicher, dass VS auf das richtige Logo.sdf zugreift, indem es die bin/Debug-Version löschte ... Ich habe es nie mit absoluten Pfaden getestet, weil ich eine Option ausgeschlossen habe, dass irgendwo eine dritte Kopie der db-Datei sein könnte. .. UND dort ist es, in "C: \ Programme (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ Logo.sdf" ... ok, so dass das Geheimnis gelöst ist - danke .. Also habe ich wirklich den absoluten Pfad zur Datei verwenden? Wenn ich die Lösung kompiliere, enthält die Konfigurationsdatei der kompilierten App auch einen absoluten Pfad, der nicht gut ist ...? – davidhq

+0

Verwenden Sie während der Entwicklung einen vollständigen Pfad, oder besser, initialisieren Sie den Kontext mit einer Verbindungszeichenfolge, die Sie im Code erstellen. – ErikEJ

Antwort

5

So war das Problem, dass die Lösung eine separate SDF-Datei erstellt hier::

„C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ Logo.sdf“

Welche unerwartete und seltsame IMHO war ...

ich diese Verbindungszeichenfolge endete:

Dies bezieht sich auf bin/Debug/Logo.sdf und es funktioniert während der Entwicklung und beim Ausführen einer .exe separat.

Die einzige Sache auf diese Weise ist, dass meine Logo.sdf-Projektdatei (die auf Debug "wenn neuere" kopiert wurde) jetzt vollständig ignoriert wird. Alle Migrationen werden auf der Debug-Datei ausgeführt werden. Das ist wahrscheinlich auch gut ....

Danke Erik für den Hinweis! david

+0

Kann bestätigen, dass dies auch für Web-Debugging mit IIS Express funktioniert. In meinem Fall habe ich versucht, zu "C: \ Programme (86) \ IIS Express \ db.sdf" zu erstellen. – Jens