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