Code First Migrações e erro de inicialização

Não tenho certeza sobre como usar o recurso de migração do primeiro código. No meu entender, ele deve criar meu banco de dados, se já não existir, e atualizá-lo para o esquema mais recente, de acordo com os arquivos de migração. Mas eu estou lutando com isso, porque eu sempre recebo muitos erros e não tenho certeza de como usá-los corretamente.

internal class Program
{
    private static void Main()
    {
        EntityFrameworkProfiler.Initialize();

        Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration>());

        using (var context = new MyContext())
        {
            var exists = context.Database.Exists();
            if (!exists)
            {
                context.Database.Create();
            }

            var element = context.Dummies.FirstOrDefault();
        }
    }
}

public class MyContext : DbContext
{
    public MyContext()
        : base(string.Format(@"DataSource=""{0}""", @"C:\Users\user\Desktop\MyContext.sdf"))
    {
    }

    public DbSet<Dummy> Dummies { get; set; }
}

internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(CodeFirstTest.MyContext context)
    {
    }
}

Usando o Entient Framework Profiler eu verifico quais instruções são executadas. Quando executo o programa sem banco de dados existente, recebo a seguinte saída:

- instrução # 1 SELECT [GroupBy1]. [A1] AS [C1] DE (SELECT COUNT (1) AS [A1] DE [__MigrationHistory] AS [Extensão1]) AS [GroupBy1]

- instrução # 2 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): A tabela especificada não existe. [__MigrationHistory] em System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) em System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () em System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (comportamento CommandBehavior, método String, opções ResultSetOptions) em System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (comportamento CommandBehavior) em System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (comportamento CommandBehavior) em System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader (comportamento CommandBehavior) em HibernatingRhinos.Profiler.Appender.ProfiledDataAccess. ProfiledCommand.ExecuteDbDataReader (comportamento CommandBehavior)

- instrução # 3 SELECT [GroupBy1]. [A1] AS [C1] DE (SELECT COUNT (1) AS [A1] DE [__MigrationHistory] AS [Extensão1]) AS [GroupBy1]

- instrução # 4 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): A tabela especificada não existe. [__MigrationHistory] em System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) em System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () em System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (comportamento CommandBehavior, método String, opções ResultSetOptions) em System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (comportamento CommandBehavior) em System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (comportamento CommandBehavior) em System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader (comportamento CommandBehavior) em HibernatingRhinos.Profiler.Appender.ProfiledDataAccess. ProfiledCommand.ExecuteDbDataReader (comportamento CommandBehavior)

- instrução # 5 SELECT [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] DE [__MigrationHistory] AS [Extensão1]) AS [GroupBy1]

- instrução # 6 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): A tabela especificada não existe. [__MigrationHistory] em System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) em System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () em System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (comportamento CommandBehavior, método String, opções ResultSetOptions) em System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (comportamento CommandBehavior) em System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (comportamento CommandBehavior) em System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader (comportamento CommandBehavior) em HibernatingRhinos.Profiler.Appender.ProfiledDataAccess. ProfiledCommand.ExecuteDbDataReader (comportamento CommandBehavior)

- instrução # 7 SELECT [GroupBy1]. [A1] AS [C1] DE (SELECT COUNT (1) AS [A1] DE [__MigrationHistory] AS [Extensão1]) AS [GroupBy1]

- instrução # 8 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): A tabela especificada não existe. [__MigrationHistory] em System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) em System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () em System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (comportamento CommandBehavior, método String, opções ResultSetOptions) em System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (comportamento CommandBehavior) em System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (comportamento CommandBehavior) em System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader (comportamento CommandBehavior) em HibernatingRhinos.Profiler.Appender.ProfiledDataAccess. ProfiledCommand.ExecuteDbDataReader (comportamento CommandBehavior)

- declaração # 9 inicia transação com nível de isolamento: serializável

- instrução # 10 CREATE TABLE [Dummies] ([Nome] nvarchar NOT NULL, CONSTRAINT [PK_Dummies] CHAVE PRIMÁRIA ([Nome]))

- declaração # 11 CREATE TABLE [MigrationHistory] ([MigrationId] nvarchar NÃO NULL, [CreatedOn] [datetime] NOT NULL, [Modelo] [imagem] NOT NULL, [ProductVersion] nvarchar NOT NULL, CONSTRAÇÃO [PK_MigrationHistory] PRIMARY KEY ([MigrationId]))

- instrução # 12 INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Modelo], [ProductVersion]) VALUES ('201207261524579_InitialCreate', '2012-07-26T15: 24: 58.523', 0x1F8B080, '4.3. 1 ')

- transação de confirmação da instrução # 13

- instrução # 14 SELECT TOP (1) [c]. [Nome] AS [Nome] FROM [Dummies] AS [c]

Como você pode ver, ele está tentando acessar o banco de dadosquatro vezes antes de criar o banco de dados. Isso não parece certo. Quando inicio o aplicativo com um banco de dados existente, ele consulta o banco de dados sete vezes antes que qualquer uma das minhas consultas reais seja executada. Note que isso acontece comcontext.Database.Create(), não com.Exists().

Além disso, o método seed da minha configuração nunca é chamado, mas o construtor é.

Isso tudo parece muito errado e confuso. Espero que alguém possa me esclarecer por que os erros acontecem com tanta frequência no começo, e porque meu método-semente não é chamado de forma alguma.

Estou usando as versões estáveis ​​mais recentes do SqlServer compact e do Entity Framework.

pacote id = "EntityFramework" version = "4.3.1" targetFramework = "net40"

pacote id = "Microsoft.SqlServer.Compact" version = "4.0.8854.2" targetFramework = "net40"

questionAnswers(3)

yourAnswerToTheQuestion