/// <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) }); }
/// <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); } }
/// <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]()); } } } } }
/// <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; }