Código de primeras migraciones y error de inicialización.

No estoy seguro de cómo usar la función de migración del código primero. A mi entender, debería crear mi base de datos si aún no existe, y actualizarla al esquema más reciente según los archivos de migración. Pero estoy luchando con eso, porque siempre recibo muchos errores y no estoy seguro en general de cómo usar esto correctamente.

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 el Entity Framework Profiler verifico que declaraciones se ejecutan. Cuando ejecuto el programa sin una base de datos existente, obtengo el siguiente resultado:

- instrucción # 1 SELECCIONE [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]

- instrucción # 2 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): la tabla especificada no existe. [__MigrationHistory] en System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) en System.Data.SqlServerCe. System.Data.SqlServerCe.SqlCeCommand.Execute .PP.A.Cu.SqlCr.nq.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png. ProfiledCommand.ExecuteDbDataReader (Comportamiento CommandBehavior)

- instrucción # 3 SELECCIONE [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]

- instrucción # 4 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): la tabla especificada no existe. [__MigrationHistory] en System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) en System.Data.SqlServerCe. System.Data.SqlServerCe.SqlCeCommand.Execute .PP.A.Cu.SqlCr.nq.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png. ProfiledCommand.ExecuteDbDataReader (Comportamiento CommandBehavior)

- instrucción # 5 SELECCIONE [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]

- declaración # 6 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): la tabla especificada no existe. [__MigrationHistory] en System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) en System.Data.SqlServerCe. System.Data.SqlServerCe.SqlCeCommand.Execute .PP.A.Cu.SqlCr.nq.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png. ProfiledCommand.ExecuteDbDataReader (Comportamiento CommandBehavior)

- instrucción # 7 SELECCIONE [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]

- declaración # 8 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): la tabla especificada no existe. [__MigrationHistory] en System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) en System.Data.SqlServerCe. System.Data.SqlServerCe.SqlCeCommand.Execute .PP.A.Cu.SqlCr.nq.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png.png. ProfiledCommand.ExecuteDbDataReader (Comportamiento CommandBehavior)

- declaración # 9 comenzar la transacción con nivel de aislamiento: Serializable

- declaración # 10 CREAR TABLA [Dummies] ([Name] nvarchar NOT NULL, CONSTRAINT [PK_Dummies] KEY PRINCIPAL ([Name]))

- declaración # 11 CREAR TABLA [Historia de migración] ([MigrationId] nvarchar NOT NULL, [CreatedOn] [datetime] NOT NULL, [Model] [image] NOT NULL, [ProductVersion] nvarchar NOT NULL, RESTRAINT [PK_MigrationHistory] CLAVE PRIMARIA ([Id. De migración]))

- declaración # 12 INTRODUZCA EN [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion]) VALUES ('201207261524579_InitialCreate', '2012-07-26T15: 24: 58.523', 0x1F8B080, '2012-07-26T15: 24: 58.523', 0x1F8B080 ' 1 ')

- declaración # 13 compromiso transacción

- declaración # 14 SELECCIONE ARRIBA (1) [c]. [Nombre] COMO [Nombre] DE [Dummies] AS [c]

Como puedes ver está intentando acceder a la base de datos.cuatro veces antes de que realmente crea la base de datos. Esto no parece correcto. Cuando inicio la aplicación con una base de datos existente, consultará la base de datos 7 veces antes de que se ejecute cualquiera de mis consultas reales. Tenga en cuenta que esto sucede concontext.Database.Create(), no con.Exists().

Además, nunca se llama al método de inicialización de mi configuración, pero sí al constructor.

Todo esto parece muy equivocado y confuso. Espero que alguien pueda iluminarme por qué los errores ocurren tan a menudo al principio, y por qué mi método de semilla no se llama en absoluto.

Estoy usando las últimas versiones estables de SqlServer compact y Entity Framework.

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

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta