public bool Exists <T>()
        {
            var guid   = StartMeasurement();
            var result = _db.GetCollectionNames().Contains(typeof(T).Name);

            StopMeasurement(guid, "Exists (LiteDB)");
            return(result);
        }
Esempio n. 2
0
        private void UpdateLookups(Type baseType, string changedListname, int oldId, int newId)
        {
            var           db = new LiteDb(_helpers, _aweCsomeTable, _connectionString);
            List <string> collectionNames = db.GetCollectionNames().ToList();
            var           subTypes        = baseType.Assembly.GetTypes();

            foreach (var subType in subTypes)
            {
                if (!collectionNames.Contains(subType.Name))
                {
                    continue;
                }

                bool modifyId = FindLookupProperties(subType, changedListname, out List <PropertyInfo> lookupProperties, out List <PropertyInfo> virtualStaticProperties, out List <PropertyInfo> virtualDynamicProperties);
                if (modifyId)
                {
                    var  collection     = db.GetCollection(subType.Name);
                    var  elements       = collection.FindAll();
                    bool elementChanged = false;
                    foreach (var element in elements)
                    {
                        foreach (var lookupProperty in lookupProperties)
                        {
                            if (element[lookupProperty.Name].IsNull)
                            {
                                continue;
                            }
                            var targetType = element[lookupProperty.Name].GetType();
                            if (targetType == typeof(LiteDB.BsonDocument))
                            {
                                var bson = (LiteDB.BsonDocument)element[lookupProperty.Name];
                                var id   = bson["_id"];
                                if (id == oldId)
                                {
                                    bson["_id"] = newId;
                                    element[lookupProperty.Name] = bson;
                                    elementChanged = true;
                                }
                            }
                            else
                            {
                                bool isId  = false;
                                int? tmpId = null;
                                try
                                {
                                    tmpId = (int?)element[lookupProperty.Name];
                                    isId  = true;
                                }
                                catch (Exception ex)
                                {
                                    _log.Warn($"Cannot cast as int. List to check: {subType.Name} TargetType: {targetType.FullName}, lookupProperty: {lookupProperty.Name}");
                                }
                                if (isId)
                                {
                                    if (tmpId == oldId)
                                    {
                                        element[lookupProperty.Name] = newId;
                                        elementChanged = true;
                                    }
                                }
                                else
                                {
                                    var idProperty = targetType.GetProperty("Id");
                                    if (idProperty == null)
                                    {
                                        _log.Warn($"Unexpected LookupType. List to check: {subType.Name} TargetType: {targetType.FullName}, lookupProperty: {lookupProperty.Name}");
                                    }
                                    else
                                    {
                                        var id = idProperty.GetValue(element[lookupProperty.Name]);
                                        if (id.Equals(oldId))
                                        {
                                            idProperty.SetValue(element[lookupProperty.Name], newId);
                                            elementChanged = true;
                                        }
                                    }
                                }
                            }
                        }
                        foreach (var virtualStaticProperty in virtualStaticProperties)
                        {
                            if (!element.ContainsKey(virtualStaticProperty.Name))
                            {
                                continue;
                            }
                            if ((int?)element[virtualStaticProperty.Name] == oldId)
                            {
                                element[virtualStaticProperty.Name] = newId;
                                elementChanged = true;
                            }
                        }
                        foreach (var virtualDynamicProperty in virtualDynamicProperties)
                        {
                            var attribute = virtualDynamicProperty.GetCustomAttribute <VirtualLookupAttribute>();
                            if (!element.ContainsKey(attribute.DynamicTargetProperty))
                            {
                                continue;
                            }

                            if (element[attribute.DynamicTargetProperty] == changedListname)
                            {
                                if ((int?)element[virtualDynamicProperty.Name] == oldId)
                                {
                                    element[virtualDynamicProperty.Name] = newId;
                                    elementChanged = true;
                                }
                            }
                        }
                        if (elementChanged)
                        {
                            collection.Update(element);
                        }
                    }
                }
            }
        }