6

codefirstとsqlserverexpress2012でエンティティフレームワーク5を使用してasp.netmvc4サイトを作成しています。

移行を有効にし、Configuration.Seedメソッドでこれを実行します(これはデータベースの最初のレコードですが、主キーを8に設定することに注意してください)。

context.ProductCategoryDtoes.AddOrUpdate(x => x.Id,
    new ProductCategoryDto() { Id = 8, Name = "category1" }
);

私のModelオブジェクトは次のように定義されています。

[Table("ProductCategory")]
public class ProductCategoryDto {
    public long Id { get; set; }
    public string Name { get; set; }
}

これにより、(SQL SERVER EXPRESS 2012)のテーブルが作成され、Id列のID = true、IDシード= 1、ID増分=1になります。

これを実行して移行を実行するPM> Update-Databaseと、Id=1の行になります。

だから私の質問は:

1)データをシードするときに、自動インクリメントされた主キーの値を制御するにはどうすればよいですか。

2)解決策がキー列のシード値をインクリメントすることである場合、を使用しているときにこれをどのように行うかDatabase.SetInitializer(new DropCreateDatabaseAlways<MyContext>());。これにより、データベースを更新するたびにデータベースが削除されて再構築されます。新しいデータベースでシード値はどのように更新されますか?

4

4 に答える 4

2

デフォルト値でダミーエンティティを作成し、実際のデータを追加してから、ダミーを削除するだけです。最善の方法ではありませんが、他に方法はないと思います...

于 2012-10-05T07:46:13.207 に答える
1

Idプロパティの上にこれを追加してみましたか?

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Id { get; set; }
于 2012-10-04T01:52:37.420 に答える
0

ID列の目的を無効にしようとしているようです。これを実行する場合は、SQLコマンドSet IDENTITY_INSERTを使用して値を挿入し、DBCCCHECKIDENTを実行してシードを更新するしかありません。あまり良い考えではありません。これらのオプションには、セキュリティとパフォーマンスの制限があります。

代わりにGUIDの使用を検討することをお勧めします。一意であることが保証されているコードでGUIDを作成できます。また、列のデフォルトとしてSQLでGUIDを生成することもできます。

順次ではないGUIDを使用する場合は、適切なインデックス作成戦略を検討する必要があります。このアプローチも議論の余地があります。

最終的には、ID列を使用する以外に別の戦略が必要になるようです。

于 2012-10-03T10:58:25.480 に答える
0

これは非常にハックですが、PK値がハードコーディングされているレポートがあるため、それを実行しなければならないシナリオに遭遇しました。レポートの修正は私の仕事の範囲を超えていました。

Context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ProductCategoryDto ON " +
     "INSERT INTO dbo.ProductCategoryDto (Id, Name) VALUES (8, 'category1') " +
     "SET IDENTITY_INSERT dbo.ProductCategoryDto OFF");
于 2013-12-23T12:30:19.473 に答える