7

Mam kilka problemów, próbując włączyć (pierwsze w kodzie) migracje dla mojej bazy danych SQL Server Compact 4.0 dla mojej aplikacji .NET na komputery.Kod SQL Server CE Pierwsze problemy z migracjami

Enable-Migrations działa i zostanie utworzony katalog Migrations. Następnie, gdy próbuję uruchomić Add-Migration InitialMigration, otrzymuję:

Dostęp do pliku bazy danych jest niedozwolony. [1914, Nazwa pliku = Logo.sdf, SeCreateFile]

To jest pierwszy problem, ale rozwiązałem go, uruchamiając Visual Studio jako Administrator ... nie lubię tego rozwiązania, a także nie wiem, czy później w produkcji będzie działać bez uruchamiania aplikacji w trybie administratora. I niech ten problem na bok na razie ...

Moje ciąg połączenia:

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

Więc po uruchomieniu Add-Migration InitialMigration w trybie administratora dostaję pustą migrację ... to jest OK. Potem usunąć migracji i dodać nową klasę:

using System; 
using System.Collections.Generic; 

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

dodać referencję do klasy kontekstu:

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

następnie uruchomić Add-Migration InitialMigration ponownie, a otrzymasz:

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"); 
    } 
} 

Po uruchomieniu Update-Database Rozumiem:

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

Teraz pojawia się problem - w moim eksploratorze serwera sprawdzam bazę danych Logo.sdf, a jej nie zawiera i zawiera tabelę Blogs! I nawet próby uruchomienia tego kodu z mojej aplikacji:

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

, aby sprawdzić, czy może moja Server Explorer nie pokazuje tabelę .. ale otrzymuję wyjątek:

Podana tabela nie istnieć. [Blogi]

Więc migracje są oczywiście nie są stosowane do mojego pliku Logo.sdf :(

Jeśli usunąć ciąg połączenia z app.config, podłączenie do lokalnej instancji SQL Server Express zakłada. I tam to działa bez zarzutu !! Kiedy zbadać bazę danych z SQL Server Management Studio, widzę nowy Blogs stół i również tabelę systemową dla metadanych na temat migracji ...

kolejny mały kawałek informacji:

Po ponownym uruchomieniu Update-Database pojawia się komunikat "Brak oczekujących migracji opartych na kodzie." I to mówi mi, że niektóre dane są zapisywane do Logo.sdf mimo wszystko ... przynajmniej niektóre metadane dotyczące migracji, ale nadal mogę " t zobacz tę tabelę w Server Explorer.

Używam VS 2012 i EF 5.0.

Proszę mi pomóc zrozumieć to ... Wydaje mi się, że coś jest naprawdę nie tak, ponieważ działa tylko z instancją SQL Server Express, ale nie z SQL Server CE 4.0. : ((

Dziękuję David

+2

Proponuję zacząć od posiadania pełnej ścieżki do pliku bazy danych w ciągu połączenia, zgaduję, że masz kilka kopii pliku bazy danych, na przykład w folderze bin/debug – ErikEJ

+0

Hmm też myślałem o tym, ale "upewniłem się", że VS uzyskuje dostęp do prawidłowego Logo.sdf poprzez usunięcie wersji bin/Debug ... Nigdy nie testowałem jej z absolutnymi ścieżkami, ponieważ wykluczyłem opcję, że gdzieś może być trzecia kopia pliku db. ... I oto jest, w "C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ Logo.sdf" ... ok tak, że zagadka jest rozwiązana - dziękuję ... Tak naprawdę mam używać bezwzględnej ścieżki do pliku? Kiedy kompiluję rozwiązanie, plik konfiguracyjny skompilowanej aplikacji zawiera również bezwzględną ścieżkę, która nie jest dobra ...? – davidhq

+0

Użyj pełnej ścieżki podczas programowania lub lepiej zainicjuj kontekst za pomocą ciągu połączenia, który konstruujesz w kodzie. – ErikEJ

Odpowiedz

5

Więc problemem było to, że rozwiązanie stworzony osobny plik .sdf tutaj!

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

co było nieoczekiwane i dziwne IMHO ...

skończyło się przy użyciu tego ciągu połączenia:

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

Odwołuje się do bin/Debug/Logo.sdf i działa podczas programowania i podczas uruchamiania pliku .exe osobno.

Jedyną rzeczą w ten sposób jest to, że mój plik projektu Logo.sdf (który został skopiowany do Debug "jeśli jest nowszy") jest teraz całkowicie ignorowany. Wszystkie migracje będą uruchamiane w pliku debugowania. To też chyba dobrze ...

Thanx Erik za podpowiedź! david

+0

Może to potwierdzić dla debugowania w Internecie za pomocą IIS Express. W moim przypadku próbował utworzyć plik "C: \ Program Files (86) \ IIS Express \ db.sdf" – Jens

Powiązane problemy