コード ファースト マイグレーション機能の使用方法がわかりません。私の理解では、データベースがまだ存在しない場合は作成し、移行ファイルに従って最新のスキーマに更新する必要があります。しかし、常に多くのエラーが発生し、これを適切に使用する方法が全体的にわからないため、苦労しています..
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)
{
}
}
Entity Framework Profiler を使用して、実行されるステートメントを確認します。データベースが存在しない状態でプログラムを実行すると、次の出力が得られます。
-- ステートメント #1 SELECT [GroupBy1].[A1] AS [C1] FROM (SELECT COUNT(1) AS [A1] FROM [__MigrationHistory] AS [Extent1]) AS [GroupBy1]
-- ステートメント #2 警告: System.Data.SqlServerCe.SqlCeException (0x80004005): 指定されたテーブルが存在しません。[ __MigrationHistory ] System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr) で System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() で System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior 動作、文字列メソッド、ResultSetOptions オプション) でSystem.Data.SqlServerCe.SqlCeCommand.ExecuteReader(CommandBehavior の動作)、System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader(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 警告: System.Data.SqlServerCe.SqlCeException (0x80004005): 指定されたテーブルが存在しません。[ __MigrationHistory ] System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr) で System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() で System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior 動作、文字列メソッド、ResultSetOptions オプション) でSystem.Data.SqlServerCe.SqlCeCommand.ExecuteReader(CommandBehavior の動作)、System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader(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 警告: System.Data.SqlServerCe.SqlCeException (0x80004005): 指定されたテーブルが存在しません。[ __MigrationHistory ] System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr) で System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() で System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior 動作、文字列メソッド、ResultSetOptions オプション) でSystem.Data.SqlServerCe.SqlCeCommand.ExecuteReader(CommandBehavior の動作)、System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader(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 警告: System.Data.SqlServerCe.SqlCeException (0x80004005): 指定されたテーブルが存在しません。[ __MigrationHistory ] System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr) で System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() で System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior 動作、文字列メソッド、ResultSetOptions オプション) でSystem.Data.SqlServerCe.SqlCeCommand.ExecuteReader(CommandBehavior の動作)、System.Data.SqlServerCe.SqlCeMultiCommand.ExecuteReader(CommandBehavior の動作)、HibernatingRhinos.Profiler.Appender.ProfiledDataAccess でProfiledCommand.ExecuteDbDataReader (CommandBehavior 動作)
-- ステートメント #9 分離レベルでトランザクションを開始: Serializable
-- ステートメント #10 CREATE TABLE [Dummies] ( [Name] nvarchar NOT NULL, CONSTRAINT [PK_Dummies] PRIMARY KEY ([Name]) )
-- ステートメント #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 ([移行 ID]) )
-- ステートメント #12 INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion]) VALUES ('201207261524579_InitialCreate', '2012-07-26T15:24:58.523', 0x1F8B080 , '4.3. 1')
-- ステートメント #13 commit トランザクション
-- ステートメント #14 SELECT TOP (1) [c].[名前] AS [名前] FROM [ダミー] AS [c]
ご覧のとおり、実際にデータベースを作成する前に、データベースに4回アクセスしようとしています。これは正しくないようです。既存のデータベースでアプリケーションを起動すると、実際のクエリが実行される前に、データベースに対して 7 回クエリが実行されます。context.Database.Create()
これはではなく で発生することに注意してください.Exists()
。
また、構成のシード メソッドは呼び出されませんが、コンストラクターは呼び出されます。
これはすべて非常に間違っていて混乱しているようです。最初にエラーが頻繁に発生する理由と、シードメソッドがまったく呼び出されない理由を誰かが教えてくれることを願っています。
SqlServer コンパクトと Entity Framework の最新の安定バージョンを使用しています。
パッケージ id="EntityFramework" バージョン="4.3.1" targetFramework="net40"
パッケージ id="Microsoft.SqlServer.Compact" バージョン="4.0.8854.2" targetFramework="net40"