Najpierw migracja kodu i błąd inicjalizacji

Nie jestem pewien, jak użyć pierwszej funkcji migracji kodu. W moim rozumieniu powinien on utworzyć moją bazę danych, jeśli jeszcze nie istnieje, i zaktualizować ją do najnowszego schematu zgodnie z plikami migracji. Ale zmagam się z tym, ponieważ zawsze mam dużo błędów i nie jestem pewien, jak właściwie to wykorzystać.

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)
    {
    }
}

Używając Entity Framework Profiler sprawdzam, jakie instrukcje są wykonywane. Po uruchomieniu programu bez istniejącej bazy danych otrzymuję następujące dane wyjściowe:

- instrukcja # 1 SELECT [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]

- instrukcja # 2 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): Podana tabela nie istnieje. [__MigrationHistory] w System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) w System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () w System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (zachowanie CommandBehavior, metoda String, opcje ResultSetOptions) w System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (zachowanie CommandBehavior) w System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (zachowanie CommandBehavior) w System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader (zachowanie CommandBehavior w HibernatingRhinos.Profiler.Appender.ProfiledDataAccess). Profiler.Appender.ProfiledDataAccess. ProfiledCommand.ExecuteDbDataReader (zachowanie CommandBehavior)

- instrukcja # 3 SELECT [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]

- instrukcja # 4 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): Określona tabela nie istnieje. [__MigrationHistory] w System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) w System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () w System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (zachowanie CommandBehavior, metoda String, opcje ResultSetOptions) w System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (zachowanie CommandBehavior) w System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (zachowanie CommandBehavior) w System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader (zachowanie CommandBehavior w HibernatingRhinos.Profiler.Appender.ProfiledDataAccess). Profiler.Appender.ProfiledDataAccess. ProfiledCommand.ExecuteDbDataReader (zachowanie CommandBehavior)

- instrukcja # 5 SELECT [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]

- instrukcja # 6 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): Określona tabela nie istnieje. [__MigrationHistory] w System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) w System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () w System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (zachowanie CommandBehavior, metoda String, opcje ResultSetOptions) w System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (zachowanie CommandBehavior) w System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (zachowanie CommandBehavior) w System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader (zachowanie CommandBehavior w HibernatingRhinos.Profiler.Appender.ProfiledDataAccess). Profiler.Appender.ProfiledDataAccess. ProfiledCommand.ExecuteDbDataReader (zachowanie CommandBehavior)

- instrukcja # 7 SELECT [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]

- instrukcja # 8 WARN: System.Data.SqlServerCe.SqlCeException (0x80004005): Określona tabela nie istnieje. [__MigrationHistory] w System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) w System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () w System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (zachowanie CommandBehavior, metoda String, opcje ResultSetOptions) w System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (zachowanie CommandBehavior) w System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (zachowanie CommandBehavior) w System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader (zachowanie CommandBehavior w HibernatingRhinos.Profiler.Appender.ProfiledDataAccess). Profiler.Appender.ProfiledDataAccess. ProfiledCommand.ExecuteDbDataReader (zachowanie CommandBehavior)

- instrukcja # 9 rozpoczyna transakcję z poziomem izolacji: Serializable

- instrukcja # 10 CREATE TABLE [Dummies] ([Name] nvarchar NOT NULL, CONSTRAINT [PK_Dummies] PRIMARY KEY ([Name]))

- instrukcja # 11 CREATE TABLE [MigrationHistory] ([MigrationId] nvarchar NOT NULL, [CreatedOn] [datetime] NOT NULL, [Model] [image] NOT NULL, [ProductVersion] nvarchar NOT NULL, CONSTRAINT [PK_MigrationHistory] PRIMARY KEY ([MigrationId]))

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

- instrukcja # 13 zatwierdza transakcję

- oświadczenie # 14 WYBIERZ TOP (1) [c]. [Imię] AS [Imię] Z [Dummies] AS [c]

Jak widać, próbuje uzyskać dostęp do bazy danychcztery razy zanim faktycznie utworzy bazę danych. To nie wydaje się właściwe. Kiedy uruchomię aplikację z istniejącą bazą danych, zapyta bazę danych 7 razy, zanim jakiekolwiek moje rzeczywiste zapytanie zostanie wykonane. Pamiętaj, że tak się dziejecontext.Database.Create(), nie z.Exists().

Również metoda seed mojej konfiguracji nigdy nie jest wywoływana, ale konstruktor jest.

To wszystko wydaje się bardzo złe i mylące. Mam nadzieję, że ktoś może mi wyjaśnić, dlaczego błędy pojawiają się tak często na początku i dlaczego moja metoda seed nie jest w ogóle wywoływana.

Korzystam z najnowszych stabilnych wersji SqlServer compact i Entity Framework.

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

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

questionAnswers(3)

yourAnswerToTheQuestion