エンティティークラスがあります
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で指定するにはどうすればよいですか?
SQL Serverを使用している場合は、カスタムデータベース初期化子を作成し、DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)
を手動で実行する必要があります。カスタムSQLコマンドでカスタム初期化子を作成して使用する場合は、 この答え を確認してください。
Ladislav Mrnkaの回答に基づいて、これを移行ファイルUp
メソッドに追加できます。
Sql("DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)");
移行スクリプトの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)にこの機能が搭載されることを期待しましょう。考え…?
@ ehsan88に基づいて、データベース初期化クラスを作成できます
public class AccDatabaseInitializer : CreateDatabaseIfNotExists<YourContect>
{
protected override void Seed(YourContect context)
{
context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)");
context.SaveChanges();
}
}
ありがとう