Я не уверен, как использовать первую функцию переноса кода. По моему мнению, он должен создать мою базу данных, если она уже не существует, и обновить ее до последней схемы в соответствии с файлами миграции. Но я борюсь с этим, потому что у меня всегда появляется много ошибок, и я не уверен, как правильно это использовать.
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)
{
}
}
Используя Profiler Framework Profiler, я проверяю, какие операторы выполняются. Когда я запускаю программу без существующей базы данных, я получаю следующий вывод:
- оператор # 1 SELECT [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]
- оператор # 2 WARN: System.Data.SqlServerCe.SqlCeException(0x80004005): Указанная таблица не существует. [__MigrationHistory] в System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr) в System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() в System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(поведение CommandBehavior, метод String, параметры ResultSetOptions) в System.Data.SqlServerCe.SqlCeCommand.ExecuteReader(поведение CommandBehavior) в System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader(поведение CommandBehavior) в System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader(поведение CommandBehavior) в HibernatingRhinos.Profiler.Appender.ProfiledDataAccess.ProfiledCommand.ExecuteDbDataReader(поведение CommandBehavior)
- оператор # 3 SELECT [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]
- оператор # 4 WARN: System.Data.SqlServerCe.SqlCeException(0x80004005): Указанная таблица не существует. [__MigrationHistory] в System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr) в System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() в System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(поведение CommandBehavior, метод String, параметры ResultSetOptions) в System.Data.SqlServerCe.SqlCeCommand.ExecuteReader(поведение CommandBehavior) в System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader(поведение CommandBehavior) в System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader(поведение CommandBehavior) в HibernatingRhinos.Profiler.Appender.ProfiledDataAccess.ProfiledCommand.ExecuteDbDataReader(поведение CommandBehavior)
- утверждение # 5 SELECT [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]
- оператор # 6 WARN: System.Data.SqlServerCe.SqlCeException(0x80004005): Указанная таблица не существует. [__MigrationHistory] в System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr) в System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() в System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(поведение CommandBehavior, метод String, параметры ResultSetOptions) в System.Data.SqlServerCe.SqlCeCommand.ExecuteReader(поведение CommandBehavior) в System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader(поведение CommandBehavior) в System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader(поведение CommandBehavior) в HibernatingRhinos.Profiler.Appender.ProfiledDataAccess.ProfiledCommand.ExecuteDbDataReader(поведение CommandBehavior)
- оператор # 7 SELECT [GroupBy1]. [A1] AS [C1] FROM (SELECT COUNT (1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]
- оператор # 8 WARN: System.Data.SqlServerCe.SqlCeException(0x80004005): Указанная таблица не существует. [__MigrationHistory] в System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr) в System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() в System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(поведение CommandBehavior, метод String, параметры ResultSetOptions) в System.Data.SqlServerCe.SqlCeCommand.ExecuteReader(поведение CommandBehavior) в System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader(поведение CommandBehavior) в System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteDbDataReader(поведение CommandBehavior) в HibernatingRhinos.Profiler.Appender.ProfiledDataAccess.ProfiledCommand.ExecuteDbDataReader(поведение CommandBehavior)
- оператор # 9 начать транзакцию с уровнем изоляции: Serializable
- оператор # 10 CREATE TABLE [Dummies] ( [Name] nvarchar NOT NULL, CONSTRAINT [PK_Dummies] ПЕРВИЧНЫЙ КЛЮЧ ([Имя]) )
- оператор # 11 CREATE TABLE [ MigrationHistory] ( [MigrationId] nvarchar NOT NULL, [CreatedOn] [datetime] NOT NULL, [Модель] [изображение] NOT NULL, [ProductVersion] nvarchar NOT NULL, CONSTRAINT [PK _MigrationHistory] ПЕРВИЧНЫЙ КЛЮЧ ([MigrationId]) )
- оператор № 12 INSERT INTO [__MigrationHistory] ([MigrationId], [Создано на], [Модель], [ProductVersion]) VALUES ('201207261524579_InitialCreate', '2012-07-26T15: 24: 58,523', 0x1F8B080 , '4.3.1')
- оператор # 13 совершить транзакцию
- оператор # 14 SELECT TOP (1) [c]. [Name] AS [Name] FROM [Dummies] AS [c]
Как вы можете видеть, он пытается получить доступ к базе данных четыре раза, прежде чем она фактически создаст базу данных. Это не кажется правильным. Когда я запускаю приложение с существующей базой данных, он будет запрашивать базу данных 7 раз, прежде чем какой-либо из моих реальных запросов будет выполнен. Обратите внимание, что это происходит с context.Database.Create()
, а не с .Exists()
.
Также метод семени моей конфигурации никогда не вызывается, но конструктор.
Все это кажется очень неправильным и запутанным. Я надеюсь, что кто-то может просветить меня, почему ошибки происходят так часто в начале и почему мой метод семени вообще не вызывается.
Я использую последние стабильные версии SqlServer compact и Entity Framework.
package id = "EntityFramework" version = "4.3.1" targetFramework = "net40"
package id = "Microsoft.SqlServer.Compact" version = "4.0.8854.2" targetFramework = "net40"