1

サイトにバナーがあります。バナーが表示されたら、DBのフィールドをインクリメントします。これはコードです:

public Banner GetBanner(CategoryBanner type)
        {
            var banners = Database.Banners.Where(b => b.IsPublish.Value &&
                                                      b.Category.Value == (int)type &&
                                                      b.PeriodShowCountAlready < b.PeriodShowCount || b.IsPublish.Value && b.Category.Value == (int)type &&
                                                      b.ShowNext < DateTime.Now);

            var count = banners.Count();
            if (count != 0)
            {
                var skip = new Random().Next(banners.Count() - 1);

                Banner banner = banners.Skip(skip).FirstOrDefault();

                if (banner != null)
                {
                    UpdatePeriodShowCountAlready(banner); // problem is inside this method

                    if (banner.ShowStart == null)
                        UpdateShowStartAndEnd(banner); 

                    return banner;
                }
            }
            return null;
        }

private void UpdatePeriodShowCountAlready(Banner banner)
        {
            try
            {
                if (banner != null)
                {
                    banner.PeriodShowCountAlready++;

                    if (banner.PeriodShowCountAlready >= banner.PeriodShowCount && banner.ShowNext < DateTime.Now)
                    {
                        banner.PeriodShowCountAlready = 0;
                        banner.ShowStart = null;
                        banner.ShowNext = null;
                    }

                    Database.SubmitChanges();
                }
            }
            catch (Exception ex)
            {
                ErrorLog.GetDefault(null).Log(new Error(ex));
            }

        }

そして、次のエラーが発生します。

System.Data.Linq.ChangeConflictException
Row not found or changed.

このエラーは簡単に再現できます。F5を数秒間押し続けるだけで十分です。このエラーが発生する理由は理解していますが、コードを正しく書き直すにはどうすればよいですか?
ありがとう。

4

0 に答える 0