EntityFramework 5 を使用して、テーブルの ID シードを "1" 以外に指定する必要がある新しいデータベースがあります。
モデルビルダー、移行、またはその他のいずれかを使用して、テーブルの ID 生成を変更してこれを処理する簡単な方法はありますか?
現時点では、テーブルが作成された後にこれを変更するために、移行中に呼び出すために生成されたカスタム SQL を作成することを検討しています。よりクリーンな解決策は、最初に CREATE TABLE を正しく取得することです。
EntityFramework 5 を使用して、テーブルの ID シードを "1" 以外に指定する必要がある新しいデータベースがあります。
モデルビルダー、移行、またはその他のいずれかを使用して、テーブルの ID 生成を変更してこれを処理する簡単な方法はありますか?
現時点では、テーブルが作成された後にこれを変更するために、移行中に呼び出すために生成されたカスタム SQL を作成することを検討しています。よりクリーンな解決策は、最初に CREATE TABLE を正しく取得することです。
私は同じ問題に取り組んでいますが、今のところ次の計画があります:
次の方法で、カスタマイズされた移行計画を初期化します。
Database.SetInitializer(新しい MigrateDatabaseToLatestVersion());
エンティティを生成する必要があることを確認します (クラス MyInitConfiguration):
protected override void Seed(MyDbContext context)
{
var he = context.Set<MyEntity>();
if (!he.Any(h => h.Id == 0))
{
...place to add code...
通常の方法でエンティティ (または複数のエンティティ) を追加しますが、「コミットを実行する前に - 外部 SQL スクリプトを呼び出します:
he.Add(new MyEntity{ Id = -5, Alias = "system",Title = "System"});
he.Add(new MyEntity{ Id = -4, Alias = "system1",Title = "System1"});
he.Add(new MyEntity{ Id = -3, Alias = "system2",Title = "System2"});
context.Database.ExecuteSqlCommand(
string.Format("DBCC CHECKIDENT ('{2}', RESEED, {0});",-5,"MyTableName")
);
context.Commit();
または次の拡張機能は、DBContext 用に準備しました:
public static void UpdateIdentity<T, TKey>(this MyDbContext context, Func<T> data, TKey staticPreviousId, string tableName,string columnName="id")
where T : MyEntity<TKey>
{
var r = data();
context.Database.ExecuteSqlCommand(string.Format("DBCC CHECKIDENT ('{2}', RESEED, {0});", staticPreviousId, r.Id, tableName, columnName));
context.Commit();
}
次に実行します。
context.UpdateIdentity(() => myDataSet.Add(new MyEntity{ Id = -5, Alias = "system",Title = "System"}), -5, "myTableName");
context.UpdateIdentity(() => myDataSet.Add(new MyEntity{ Id = 81, Alias = "system",Title = "System"}), 80, "myTableName");
残念ながら、クエリバッチを実行する前に「プレクエリを追加」する方法が見つかりませんでした。誰かがそれを行う方法を見つけた場合、コミットを実行する前に、SQLを実行できます:「set identity_inster on」
後
「identity_inster をオフに設定」
これは t-sql にとってより自然です