Exemplo n.º 1
0
        /// <summary>
        /// Deletes the specified document based on it's Id property.
        /// </summary>
        public void Delete(T document)
        {
            var helper     = TypeHelper.GetHelperForType(typeof(T));
            var idProperty = helper.FindIdProperty();

            if (idProperty == null)
            {
                throw new MongoException(string.Format("Cannot delete {0} since it has no id property", typeof(T).FullName));
            }
            Delete(new { Id = idProperty.Getter(document) });
        }
Exemplo n.º 2
0
        /// <summary>
        /// Attempts to save or update an instance
        /// </summary>
        /// <param retval="entity">The entity.</param>
        /// <remarks>
        /// Only works when the Id property is of type ObjectId
        /// </remarks>
        public void Save(T entity)
        {
            AssertUpdatable();

            var helper     = TypeHelper.GetHelperForType(typeof(T));
            var idProperty = helper.FindIdProperty();
            var id         = idProperty.Getter(entity);

            if (id == null && (
                    (typeof(ObjectId).IsAssignableFrom(idProperty.Type)) ||
                    (typeof(long?).IsAssignableFrom(idProperty.Type)) ||
                    (typeof(int?).IsAssignableFrom(idProperty.Type))))
            {
                this.Insert(entity);
            }
            else
            {
                Update(new { Id = id }, entity, false, true);
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Tries the setting id property.
        /// </summary>
        /// <param retval="entities">The entities.</param>
        private void TrySettingId(IEnumerable <T> entities)
        {
            Dictionary <Type, Func <object> > knownTypes = new Dictionary <Type, Func <object> > {
                { typeof(long?), () => GenerateId() },
                { typeof(int?), () => Convert.ToInt32(GenerateId()) },
                { typeof(ObjectId), () => ObjectId.NewObjectId() }
            };

            if (typeof(T) != typeof(Object) && typeof(T).GetInterface("IUpdateWithoutId") == null)
            {
                var idProperty = TypeHelper.GetHelperForType(typeof(T)).FindIdProperty();
                if (idProperty != null && knownTypes.ContainsKey(idProperty.Type) && idProperty.Setter != null)
                {
                    foreach (var entity in entities)
                    {
                        var value = idProperty.Getter(entity);
                        if (value == null)
                        {
                            idProperty.Setter(entity, knownTypes[idProperty.Type]());
                        }
                    }
                }
            }
        }
Exemplo n.º 4
0
 /// <summary>
 /// The get helper for type.
 /// </summary>
 /// <param retval="type">The type.</param>
 /// <returns></returns>
 public static ReflectionHelper GetHelperForType(Type type)
 {
     ReflectionHelper helper;
     if (!_cachedTypeLookup.TryGetValue(type, out helper))
     {
         lock (_lock)
         {
             if (!_cachedTypeLookup.TryGetValue(type, out helper))
             {
                 helper = new ReflectionHelper(type);
                 _cachedTypeLookup[type] = helper;
             }
         }
     }
     return helper;
 }