web-dev-qa-db-ja.com

EFコードファースト-アイデンティティシードの設定方法

エンティティークラスがあります

public class Employee
{
    public long Id { get; set; }
    public string Name { get; set; }
}

自動番号生成でIdフィールドを主キーとして設定しました

modelBuilder.Entity<Employee>().HasKey(e => e.Id);
modelBuilder.Entity<Employee>().Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

しかし、私はアイデンティティがデフォルトである1からではなく10000からシードすることを望みます。これをEFで指定するにはどうすればよいですか?

31
Achinth Gurkhi

SQL Serverを使用している場合は、カスタムデータベース初期化子を作成し、DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)を手動で実行する必要があります。カスタムSQLコマンドでカスタム初期化子を作成して使用する場合は、 この答え を確認してください。

32
Ladislav Mrnka

Ladislav Mrnkaの回答に基づいて、これを移行ファイルUpメソッドに追加できます。

Sql("DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)");
15
Ehsan88

移行スクリプトのUpメソッドから "DBCC CHECKIDENT( 'TableName'、RESEED、NewSeedValue)"スクリプトを実行することにより、アイデンティティシードが1000であることと同じ出力を確実に得ることができます。

ただし、テーブルに入力された最初のレコードのIDが1000であっても、SQL Serverのテーブル定義には「IDENTITY(1,1)」と表示されます。これは、テーブルのIDシードが実際には1000に設定されていないことを意味します。もちろん、最初のレコードの作成中に最初の999値が消費またはスキップされるだけです。もちろん、RESEEDコマンドをDBに発行しているためです。つまり、すでに設定されているSEEDを変更しているためです。

結論として、EFコアv2.1では、Microsoftはテーブルの作成中にIDシード値をカスタマイズする機能を提供していなかったようです。 EF Coreの将来のバージョン(おそらく2.2または3.0)にこの機能が搭載されることを期待しましょう。考え…?

0
Ankur Deshmukh

@ ehsan88に基づいて、データベース初期化クラスを作成できます

 public class AccDatabaseInitializer : CreateDatabaseIfNotExists<YourContect>
    {
      protected override void Seed(YourContect context)
       {
          context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)");
           context.SaveChanges();
       }
    }

ありがとう

0
kareem khalil