Beispiel #1
0
        //private IMongoCollection<T> GetNowSnapCollection()
        //{
        //    return GetSnapCollection(DateTime.Now);
        //}
        public void Add(T model, DateTime?modelTime = null)
        {
            DateTime time = modelTime ?? DateTime.Now;

            model.CreatedOn = time;
            OriginalCollection.InsertOne(model, null, new CancellationToken());
            foreach (var snapCollection in GetValidSnapCollectionAfter(time))
            {
                snapCollection.InsertOne(model, null, new CancellationToken());
            }
        }
Beispiel #2
0
        public long Delete <TKey>(TKey key, DateTime?modelTime = null)
        {
            var filter = GetFilterDefinitionOfKey(key);
            var result = OriginalCollection.DeleteOne(filter);

            if (result.DeletedCount < 1)
            {
                return(0);
            }
            DateTime time           = modelTime ?? DateTime.Now;
            var      snapCollection = GetSnapCollection(time);
            var      uresult        = snapCollection.UpdateOne(filter, Builders <T> .Update.Set(x => x.Deleted, true).Set(x => x.DeletedTime, time));

            return(uresult.ModifiedCount);
        }
Beispiel #3
0
        public void AddOrEdit(T model, DateTime?modelTime = null)
        {
            DateTime time      = modelTime ?? DateTime.Now;
            var      filterDef = GetFilterDefinitionOfKey(model);
            var      modelInDb = OriginalCollection.Find(filterDef).FirstOrDefault();

            if (modelInDb == null)
            {
                Add(model, time);
            }
            else
            {
                Edit(model, modelInDb, time);
            }
        }
Beispiel #4
0
        public void Edit(T model, DateTime?modelTime = null)
        {
            DateTime time      = modelTime ?? DateTime.Now;
            var      filterDef = GetFilterDefinitionOfKey(model);
            var      modelInDb = OriginalCollection.Find(filterDef).FirstOrDefault();

            if (modelInDb == null)
            {
                throw new Exception("can't find such record");
            }
            else
            {
                Edit(model, modelInDb, time);
            }
        }
Beispiel #5
0
 /// <summary>
 /// 从主表复制到
 /// </summary>
 /// <param name="time"></param>
 /// <returns></returns>
 private bool CopyToSnap(IMongoCollection <T> snapCollection)
 {
     if (snapCollection.CountDocuments(x => true) > 0)
     {
         return(false);
     }
     lock (CopyLocker)
     {
         if (snapCollection.CountDocuments(x => true) > 0)
         {
             return(true);//被别的线程锁定之后再进入的。
         }
         snapCollection.InsertMany(
             OriginalCollection.Find(x => !x.Deleted).ToEnumerable()
             );
     }
     return(true);
 }
Beispiel #6
0
        private bool Edit(T model, T modelInDb, DateTime modelTime)
        {
            var filterDef  = GetFilterDefinitionOfKey(model);
            var listChange = ModelCompareHelper.Compare(model, modelInDb, modelTime);
            //下面更新主表字段 和 快照表的ChangeRecords
            UpdateDefinitionBuilder <T> builder = Builders <T> .Update;
            UpdateDefinition <T>        update  = null;

            update = builder.PushEach("ChangeRecords", listChange.Select(x => x.ToRecord()));
            foreach (var snapCollection in GetValidSnapCollectionAfter(modelTime))
            {
                var modelInSnap = snapCollection.Find(filterDef).FirstOrDefault();
                if (modelInSnap == null)
                {
                    if (!CopyToSnap(snapCollection))
                    {
                        throw new Exception("Database Error.");//这种情况一般是snap有了,但是没有当前数据。 我暂时也不知道如何处理。
                    }
                }
                var snapResult = snapCollection.UpdateOne(filterDef, update);
            }

            update = Builders <T> .Update.Set(x => x.ModifiedOn, modelTime);

            foreach (var change in listChange)
            {
                update = update.Set(change.FieldName, change.NewValue);
            }
            var result = OriginalCollection.UpdateOne(filterDef, update);

            if (result.ModifiedCount < 1)
            {
                throw new Exception("Error Happenned when Update Database");
            }

            return(true);
        }
Beispiel #7
0
        private T GetModelFromLast <TKey>(TKey key)
        {
            var model = OriginalCollection.Find(GetFilterDefinitionOfKey(key)).FirstOrDefault();

            return(model);
        }