2014-01-07 6 views
56

を、私は、移行に(EF 5.0)とコード-最初使用して面白い効果を持っている(?):私はGUIDでいくつかのモデルを作成したEntity Frameworkのコード - 最初:移行は強制的に、更新データベースで失敗し不必要なアドオン移行

を主キー。 (私にとって重要なことは、現在のバージョンではデフォルト値であると思われるNEWSEQUENTIALID()をSQL Serverが使用することです)

ある時点で私は移行を有効にしました。最初の移行にいくつかのコードを追加しましたが、これはほとんどの場合、必要に応じて.Index()です。私は、データベースおよびコールアップデート - データベースを削除

、私は次のエラーを取得:私はAutomaticMigrationsEnabled = trueを試してみました

Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration. You can use the Add-Migration command to write the pending model changes to a code-based migration.

、変更または何も追加せずに働きました!

AutomaticMigrationsEnabledが欲しくないので、私はupdate-databaseと、add-migrationというデータベースを再度削除しようとしました。私は何も変えないような追加の移行を終えました(下記参照)。私はまた、これらの行を最初のマイグレーションの最後に追加しようとしましたが、これは何も変わりません。

モデルのひとつ:

[Table(Speaker.TABLENAME)] 
public class Speaker : BaseModel 
{ 
    public const String TABLENAME = "Speaker"; 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 

    [Required] 
    [MaxLength(50, ErrorMessage = "Name must be 50 characters or less")] 
    public string Name { get; set; } 
} 

初期移行コード:以下

public partial class InitialCreate : DbMigration 
{ 
    public override void Up() 
    { 
     // [...] 
     CreateTable(
      "dbo.Speaker", 
      c => new 
       { 
        Id = c.Guid(nullable: false, identity: true), 
        Name = c.String(nullable: false, maxLength: 50), 
       }) 
      .PrimaryKey(t => t.Id) 
      .Index(t => t.Name, true, false); // added manually: unique Name 
     // [...] 
    } 
} 

internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 

    protected override void Seed(MyProject.Repositories.DBContext context) 
    { 
     // ... 
    } 
} 

アドインの移行により作成されたコードである:新しい何かをしていないようだ - 多分私は何かが欠けている?

public partial class UnneccessaryMigration : DbMigration 
{ 
    public override void Up() 
    { 
     // isn't this the exact same code from InitialMigrations? 
     AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true)); 
     // ... 
    } 

    public override void Down() 
    { 
     //... 
     AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false)); 
    } 
} 

私は不思議です:マイグレーションを混乱させるために私は何をしましたか?最初の移行を1回だけ実行するにはどうすればよいですか?

ソリューション:次の回避策は、私のためにそれをやった:ここdecribedとして 1.私は、データベースとすべてのマイグレーションを削除: https://stackoverflow.com/a/11679386/3168401 2.初期 3.私の手作りの合併有効-移行を+アドオンの移行を実行します.Index()はファイルに変更されます。 Update-Databaseは、データベースを削除するときに繰り返し実行されます。

答えて

83

I also tried deleting the database again, called update-database and then add-migration. I ended up with an additional migration that seems not to change anything (see below)

、私はあなたが最初の最後の事を行っていると思います。 Add-migrationの前にUpdate databaseを実行すると、移行スキーマでデータベースが更新されません。まず、移行を追加してからupdateコマンドを実行する必要があります。

パッケージマネージャコンソールを使用して、この順序で試してみてください。

PM> Enable-migrations //You don't need this as you have already done it 
PM> Add-migration Give_it_a_name 
PM> Update-database 
+2

私はこの時点で間違っているかもしれませんが、私は必要に応じてデータベースを再作成できるようにしたいと考えています。最初の移行はまったくそれをしませんか?上記の効果を偶然発見する前に、update-databaseを使ってデータベースを作成するとうまくいきました。そして、「空白の子供」移行ステップを追加するとすぐに、それも機能します。 –

+0

データベースが存在しない場合、update databaseコマンドはデータベースを再作成し、使用可能な移行でデータベースを更新します。データベースを更新する必要がある場合は、最初に 'add-migration'を実行し、' update database'を実行して変更を追加する必要があります。 – Kaf

+0

私は最初に「役に立たない」移行がなぜ追加されたのか不思議です。 –

9

Entity Frameworkには、IDフィールドに関するいくつかの問題があります。これらの

You can't add GUID identity on existing table

Migrations: does not detect changes to DatabaseGeneratedOption

Reverse engineering does not mark GUID keys with default NEWSEQUENTIALID() as store generated identities

どれも正確にあなたの問題について説明していないし、それが列からIDENTITYを削除しようとしているように見えるので、あなたの余分な移行でダウン()メソッドは面白いです最初の移行でCREATE TABLEが設定されているように見えます!あなたはこれらのAlterColumnメソッドから実行されたSQLを表示するUpdate-Database -ScriptまたはUpdate-Database -Verboseを使用している場合

さらに、あなたは、SQL UpDownが同一であることがわかりますし、実際に何もしません。IDENTITYは、私がリンクしている最初の2つの問題に説明されているように、現在のバージョン(EF 6.0.2以下)では変更されません。

余分な移行で冗長コードを削除し、今すぐ空の移行を実行する必要があると思います。そしてあなたは、取り組むべき課題に/投票することができます。

参考:上記の内容に基づいて

Change IDENTITY option does diddly squat

Switch Identity On/Off With A Custom Migration Operation

+0

これらのヒントをありがとうございました!私はそれらの問題をupvoteするつもりです。今のところ、私はウォーホルのマイグレーションフォルダ、データベース、再スタートセットを削除することで問題を回避することができました:Enable-Migrations、Add-Migration、そして.Index()をもう一度追加しました。これはうまくいくようです。 –