現在、MVC 4 と EF を使用して深刻な問題に何度か遭遇しています。この問題は、次の例で最もよく説明されています。
次の PK、1、2、3、4 を持つ DB テーブルにレコードがあります。1と2は削除。EF が新しいレコードを挿入しようとすると、再び PK 1 が割り当てられます。次の挿入では 2 が使用され、次に 3 が試行されて PK 違反が発生します。
昨日、別の挿入物を含む別のテーブルで同じものを見ました。
次の画像では、PK 3 で新しいレコードを挿入するときに db.SaveChanges が失敗したことがわかります。
次の画像からわかるように、DB は自動インクリメントに設定されています。
これが私のコントローラーアクションです(挿入と編集に使用されますが、それは問題ではありません):
if (ModelState.IsValid)
{
//update pricelist
Pricelist pricelist = new Pricelist();
pricelist.InjectFrom(adminEditPricelistVM.Pricelist);
pricelist.PricelistProducts = new List<PricelistProduct>();
pricelist.SubscriberId = (int)UserManagement.getUsersSubscriberId(WebSecurity.GetUserId(System.Web.HttpContext.Current.User.Identity.Name));
if (adminEditPricelistVM.Pricelist.PricelistId != 0)
{
db.Entry(pricelist).State = EntityState.Modified;
}
else
{
db.Pricelists.Add(pricelist);
}
db.SaveChanges();
adminEditPricelistVM.Pricelist.PricelistId = pricelist.PricelistId;
etc...
私が持っている唯一の手がかりは、私のデータのシード設定で、次のコマンドを使用して、データを置き換えるときに 1 でシードを開始していることです。
context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('Features', RESEED, 1)");
おそらくこれは何か関係があるのでしょうが、私はそれを疑っています - これはその時点では呼び出されていないからです。
ところで、これは一貫していません。手動で複製できません。時々発生するようであり、発生した場合、EF は、使用されているすべての ID を渡し、次の空いている ID を見つけるまで、挿入の試行ごとにエラーを続けます。つまり、PK 3 での挿入でエラーが発生します。次の挿入試行では PK 4 でエラーが発生し、PK 5 が使用されていないため、次の試行では成功します。あたかも、リセットされるどこかで使用中の PK のメモリがあるかのようです。
どんな助けでも大歓迎です!