0

EntityFramework 5 を使用して、テーブルの ID シードを "1" 以外に指定する必要がある新しいデータベースがあります。

モデルビルダー、移行、またはその他のいずれかを使用して、テーブルの ID 生成を変更してこれを処理する簡単な方法はありますか?

現時点では、テーブルが作成された後にこれを変更するために、移行中に呼び出すために生成されたカスタム SQL を作成することを検討しています。よりクリーンな解決策は、最初に CREATE TABLE を正しく取得することです。

4

2 に答える 2

0

私は同じ問題に取り組んでいますが、今のところ次の計画があります:

  1. 次の方法で、カスタマイズされた移行計画を初期化します。

    Database.SetInitializer(新しい MigrateDatabaseToLatestVersion());

  2. エンティティを生成する必要があることを確認します (クラス MyInitConfiguration):

    protected override void Seed(MyDbContext context)
    {
        var he = context.Set<MyEntity>();
        if (!he.Any(h => h.Id == 0))
        {
             ...place to add code...
    
  3. 通常の方法でエンティティ (または複数のエンティティ) を追加しますが、「コミットを実行する前に - 外部 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");
于 2013-01-03T11:06:26.943 に答える
0

残念ながら、クエリバッチを実行する前に「プレクエリを追加」する方法が見つかりませんでした。誰かがそれを行う方法を見つけた場合、コミットを実行する前に、SQLを実行できます:「set identity_inster on」

「identity_inster をオフに設定」

これは t-sql にとってより自然です

于 2013-01-03T11:10:12.253 に答える