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"