0

現在、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 のメモリがあるかのようです。

どんな助けでも大歓迎です!

4

1 に答える 1