Код структуры Entity Framework сначала не создает базу данных

Я создал класс контекста db и добавил строку подключения в свой файл web.config, как указано в Scott Guthrie Code First Development с Entity Framework 4. Я запускаю его из тестового метода. Я получил несколько ошибок базы данных, выполняющих тесты, но когда я, наконец, очистил классы, чтобы тест прошел успешно, у меня все еще не было базы данных в папке App_data.

Я добавил Database.CreateIfNotExists() в конструктор dbContext, но все еще не sdf файл. Кто-нибудь знает, что я делаю неправильно?

Ответ 1

Для того, чтобы база данных была автоматически создана, имя строки подключения должно быть названо в точности как имя подкласса DbContext (с пространством имен).

Eg. Скажите, что ваш класс DB выглядит следующим образом:

namespace MyNamespace
{
    public class FooDb : DbContext
    {    
        public DbSet<XXX> ABC{ get; set; }
    }
}

Строка подключения должна выглядеть так:

  <connectionStrings>
    <add name="MyNamespace.FooDb" connectionString="Data Source=|DataDirectory|MyNamespace.FooDb.sdf" providerName="System.Data.SqlServerCe.4.0"/>
  </connectionStrings>

Ответ 2

Проверить SQL Server Management Studio → .\sqlexpress

То, где CF помещало все мои базы данных, когда я не указываю строку подключения.

Ответ 3

См. здесь для автоматического создания .sdf с EF 4.1 и пакета SQL CE NuGet (или, возможно, нового проекта MVC 3):

http://www.goatly.net/2011/6/27/entity-framework-code-first-the-path-is-not-valid-check-the-directory-for-the-database.aspx

Короче говоря: Создайте пустую папку App_Data - файл sdf будет создан автоматически, но только если папка, в которую она входит, присутствует.

Ответ 4

Убедитесь, что ваш dbcontext использует правильную строку подключения Что-то похожее на это

public class DBContext : IdentityDbContext<ApplicationUser>
    {
        public DBContext ()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }
}

И в web.config

<add name="DefaultConnection" connectionString="Server=....;Connection Timeout=300;" providerName="System.Data.SqlClient" />