Code First Migrations- und Initialisierungsfehler

Ich bin mir nicht sicher, wie ich die Funktion für die erste Codemigration verwenden soll. Nach meinem Verständnis sollte meine Datenbank erstellt werden, falls sie noch nicht vorhanden ist, und gemäß den Migrationsdateien auf das neueste Schema aktualisiert werden. Aber ich habe Probleme damit, weil ich immer eine Menge Fehler bekomme und insgesamt unsicher bin, wie ich das richtig benutze.

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

Mit dem Entity Framework Profiler überprüfe ich, welche Anweisungen ausgeführt werden. Wenn ich das Programm ohne vorhandene Datenbank starte, erhalte ich die folgende Ausgabe:

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

- Anweisung Nr. 2 WARNUNG: System.Data.SqlServerCe.SqlCeException (0x80004005): Die angegebene Tabelle existiert nicht. [__MigrationHistory] bei System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) bei System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () bei System.Data.SqlServerCe.SqlCeCommand.ExecuteCe.SqlCeCeCeCommand () System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (CommandBehavior-Verhalten) bei System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (CommandBehavior-Verhalten) bei System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDefault (CommandBehavior) bei. ProfiledCommand.ExecuteDbDataReader (CommandBehavior-Verhalten)

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

- Anweisung Nr. 4 WARNUNG: System.Data.SqlServerCe.SqlCeException (0x80004005): Die angegebene Tabelle existiert nicht. [__MigrationHistory] bei System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) bei System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () bei System.Data.SqlServerCe.SqlCeCommand.ExecuteCe.SqlCeCeCeCommand () System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (CommandBehavior-Verhalten) bei System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (CommandBehavior-Verhalten) bei System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDefault (CommandBehavior) bei. ProfiledCommand.ExecuteDbDataReader (CommandBehavior-Verhalten)

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

- Anweisung Nr. 6 WARNUNG: System.Data.SqlServerCe.SqlCeException (0x80004005): Die angegebene Tabelle existiert nicht. [__MigrationHistory] bei System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) bei System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () bei System.Data.SqlServerCe.SqlCeCommand.ExecuteCe.SqlCeCeCeCommand () System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (CommandBehavior-Verhalten) bei System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (CommandBehavior-Verhalten) bei System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDefault (CommandBehavior) bei. ProfiledCommand.ExecuteDbDataReader (CommandBehavior-Verhalten)

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

- Anweisung Nr. 8 WARNUNG: System.Data.SqlServerCe.SqlCeException (0x80004005): Die angegebene Tabelle existiert nicht. [__MigrationHistory] bei System.Data.SqlServerCe.SqlCeCommand.ProcessResults (Int32 hr) bei System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan () bei System.Data.SqlServerCe.SqlCeCommand.ExecuteCe.SqlCeCeCeCommand () System.Data.SqlServerCe.SqlCeCommand.ExecuteReader (CommandBehavior-Verhalten) bei System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader (CommandBehavior-Verhalten) bei System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDefault (CommandBehavior) bei. ProfiledCommand.ExecuteDbDataReader (CommandBehavior-Verhalten)

- Anweisung Nr. 9 beginnt die Transaktion mit der Isolationsstufe: Serializable

- Anweisung Nr. 10 CREATE TABLE [Dummies] ([Name] nvarchar NOT NULL, CONSTRAINT [PK_Dummies] PRIMARY KEY ([Name]))

- Anweisung # 11 CREATE TABLE [Migrationsverlauf] ([Migrations-ID] nvarchar NICHT NULL, [Erstellt am] [Datum / Uhrzeit] NICHT NULL, [Modell] [Image] NICHT NULL, [Produktversion] nvarchar NICHT NULL, CONSTRAINT [PK_MigrationHistory] PRIMARY KEY ([MigrationId])

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

- Festschreibung Nr. 13 Transaktion festschreiben

- Anweisung # 14 SELECT TOP (1) [c]. [Name] AS [Name] FROM [Dummies] AS [c]

Wie Sie sehen, wird versucht, auf die Datenbank zuzugreifenvier mal, bevor es tatsächlich die Datenbank erstellt. Das scheint nicht richtig. Wenn ich die Anwendung mit einer vorhandenen Datenbank starte, fragt sie die Datenbank siebenmal ab, bevor eine meiner tatsächlichen Abfragen ausgeführt wird. Beachten Sie, dass dies mit passiertcontext.Database.Create(), nicht mit.Exists().

Auch die Seed-Methode meiner Konfiguration wird nie aufgerufen, der Konstruktor jedoch.

Das alles scheint nur sehr falsch und verwirrend. Ich hoffe, dass mich jemand aufklären kann, warum die Fehler am Anfang so häufig auftreten und warum meine Samenmethode überhaupt nicht aufgerufen wird.

Ich verwende die neuesten stabilen Versionen von SqlServer Compact und Entity Framework.

Paket-ID = "EntityFramework" Version = "4.3.1" targetFramework = "net40"

Paket-ID = "Microsoft.SqlServer.Compact" Version = "4.0.8854.2" targetFramework = "net40"

Antworten auf die Frage(3)

Ihre Antwort auf die Frage