7

У меня возникли проблемы с попытками включить (кодовые) миграции для моей базы данных SQL Server Compact 4.0 для моего настольного приложения .NET.SQL Server CE-код Проблемы с первыми миграциями

Enable-Migrations действительно работает, и каталог Migrations создан. После этого, когда я пытаюсь запустить Add-Migration InitialMigration, я получаю:

Доступ к файлу базы данных не допускается. [1914, имя файла = Logo.sdf, SeCreateFile]

Это первая проблема, но я решил, запустив Visual Studio как администратор ... не нравится это решение, а также делать, если не знаете позже он будет работать без запуска приложения в режиме администратора. Я позволяю эту проблему в стороне теперь ...

Моя строка соединения:

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

Таким образом, после запуска Add-Migration InitialMigration в режиме администратора, я получаю пустой миграции ... это нормально. Затем я удаляю миграцию и добавить новый класс:

using System; 
using System.Collections.Generic; 

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

добавить ссылку на класс контекста:

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

Затем запустите Add-Migration InitialMigration снова и получить:

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

После запуска Update-Database Я вижу:

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

Теперь проблема возникает - в моем обозревателе серверов я изучаю базу данных Logo.sdf и ее не содержит таблицу Blogs! Я даже пытаюсь запустить этот код из моего приложения:

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

, чтобы проверить, если возможно, мой сервер Проводник не показывает таблицу .. но я получаю исключение:

Указанная таблица не существовать. [Блог]

Так миграция, очевидно, не применяется к моему Logo.sdf файлу :(

Если удалить строку подключения из app.config, подключение к локальному экземпляру SQL Server Express предполагаются. И там работает безупречно !! Когда я анализирую базу данных с помощью SQL Server Management Studio, я вижу новую Blogs таблицу, а также системную таблицу метаданных о миграции ...

другой маленький кусочек информации:

Когда я снова пытаюсь запустить Update-Database, я получаю «Нет ожидающих миграции на основе кода». Это говорит о том, что некоторые данные сохраняются в Logo.sdf после ... хотя бы некоторых метаданных о миграции, но все же я могу " таблицу в проводнике сервера.

Я использую VS 2012 и EF 5.0.

Пожалуйста, помогите мне понять это ... Мне кажется, что что-то серьезно не так, потому что оно просто работает с экземпляром SQL Server Express, но не с SQL Server CE 4.0. : ((

Спасибо Дэвид

+2

Предложите, чтобы вы начали с полного пути к файлу базы данных в вашей строке подключения, я полагаю, у вас есть несколько копий файла базы данных, например, в папке bin/debug – ErikEJ

+0

Хм я тоже подумал об этом, но я «удостоверился», что VS обратился к правильному логотипу Logo.sdf, удалив версию bin/Debug ... Я никогда не тестировал ее с абсолютными путями, потому что я исключил вариант, который может быть где-то в третьей копии файла db. .. И там это, в «C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ Logo.sdf" ... так, чтобы тайна была решена - спасибо .. Так что у меня действительно есть использовать абсолютный путь к файлу? Когда я компилирую решение, файл конфигурации скомпилированного приложения также содержит абсолютный путь, который не является хорошим ...? – davidhq

+0

Используйте полный путь во время разработки или лучше инициализируйте контекст строкой соединения, которую вы создаете в коде. – ErikEJ

ответ

5

Таким образом, проблема в том, что решение создали отдельный SDF-файл здесь:

«C: \ Program Files (x86) \ Microsoft Visual Studio 11,0 \ Common7 \ IDE \ Logo.sdf»

Что было неожиданным и странным ИМХО ...

Я закончил с использованием этой строки подключения:

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

Это ссылки bin/Debug/Logo.sdf, и он работает во время разработки и при работе с .exe отдельно.

Единственное, что с этим связано, это то, что мой файл проекта Logo.sdf (который был скопирован в Debug «если новый») теперь полностью игнорируется. Все миграции будут выполняться в файле Debug. Вероятно, это тоже хорошо.

Thanx Erik для подсказки! david

+0

Может подтвердить, что это работает для веб-отладки с помощью IIS Express. В моем случае он попытался создать «C: \ Program Files (86) \ IIS Express \ db.sdf» – Jens

Смежные вопросы