代码之家  ›  专栏  ›  技术社区  ›  c_atlantis

ASP.Net-Mvc5:LINQ,保存重复记录问题

  •  0
  • c_atlantis  · 技术社区  · 7 年前

    我正在给每日计数器编码。数据库计数器表为空。如果有人是我当天的第一个访问者,那么我将向数据库中添加一个记录,并将counter设置为1;之后,当其他访客访问当天时,我将增加计数器++并更新记录。

    所以我的记录一定是这样的:

    01 柜台:23

    02 计数器:65

    日期:2018-10- 03

    日期:2018-10- 04 柜台:89

    我的问题是:如果站点在同一时间获得访客,linq为同一天保存2条记录。这样地:

    日期:2018-10-

    日期:2018-10-02计数器:1//第一条记录:counter=1

    日期:2018-10- 03 计数器:20

    计数器:1//第一条记录

    04

    日期必须唯一。如何解决这个问题?我的代码在下面。谢谢。

    public static int IncreaseCounter_DailySiteVisitors()
        {
            int counter = 0;
            using (var context = new MyProjectEntities())
            {
                try
                {
                    string format = "dd.MM.yyyy";
                    DateTime Today = DateTime.Now;
                    var obj = (from record in context.CounterDailySiteVisitor
                               where 
                               record.DateRecord != null 
                               && record.DateRecord.HasValue 
                               && record.DateRecord.Value.Year == Today.Year 
                               && record.DateRecord.Value.Month == Today.Month
                               && record.DateRecord.Value.Day == Today.Day
                               select record).FirstOrDefault();
    
    
    
                   //var obj = context.CounterDailyVisitor.Where(x => x.DateRecord != null && ((DateTime)x.DateRecord).ToString("yyyy.MM.dd") == DateTime.Now.ToString("yyyy.MM.dd")).FirstOrDefault();
                    if (obj != null)
                    {
                        counter = obj.Count ?? 0;
                        counter++;
                        obj.Count = counter;
                        context.SaveChanges();
                    }
                    else
                    {
                        var newRecordObj = context.CounterDailySiteVisitor.Create();
                        newRecordObj.Count = 1;
                        newRecordObj.DateRecord = Today;
                        context.CounterDailySiteVisitor.Add(newRecordObj);
                        context.SaveChanges();
                    }
                }
                catch (Exception e)
                {
    
                }
    
    
            }
            return counter;
        }
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Seabizkit    7 年前

    同时被两条线击中的几率很低。 但我想技术上是可以的,所以你需要把它锁起来

    像下面这样。。。

    public static int IncreaseCounter_DailySiteVisitors()
    {
        private readonly object somethingObject = new object();
    
        var context = new MyProjectEntities() 
    
        var today = DateTime.Now;
        var todaysRecord = context.CounterDailyVisitor
                    .SingleOrDefault(x => x.DateRecord.Year == Today.Year
                                && x.DateRecord.Month == Today.Month
                               && x.DateRecord.Day == Today.Day
                    );
        if (todaysRecord != null)
        {
           //the existing count + 1
           todaysRecord.Count = todaysRecord.Count++;
        }
        else
        {
    
           Lock(somethingObject)
           {
               //recheck
               var todaysRecord = context.CounterDailyVisitor
                       .SingleOrDefault(x => x.DateRecord.Year == Today.Year
                           && x.DateRecord.Month == Today.Month
                        && x.DateRecord.Day == Today.Day
                    );
    
               if (todaysRecord != null)
               {
                   //the existing count + 1
                   todaysRecord.Count = todaysRecord.Count++;
               }
               else
               {
                var newRecordObj = new CounterDailyVisitor();
                newRecordObj.Count = 1;
                newRecordObj.DateRecord =  DateTime.Now; //this shouldnt be nullable
    
                context.CounterDailySiteVisitor.Add(newRecordObj);
               }    
            }
        }
        context.SaveChanges();
    }
    
        2
  •  0
  •   Janus Pienaar    7 年前

    Lock 在读取并随后更新/插入值的代码周围。或者您应该调用一个存储过程,并将所有逻辑放在存储过程中。

    推荐文章