private bool SetAuditUser(string fieldName, object entity, EntityMetadata entityMetadata, out object previousValue) { if (entity == null) throw new ArgumentNullException("entity"); var entityType = entityMetadata.EntityType; var getters = entityMetadata.Getters; PropertyGetter getter; if (getters.TryGetValue(fieldName, out getter)) { previousValue = getter(entity); } else { previousValue = null; } if (this.CurrentUserId == null) return false; var setters = PropertyHelper.GetPropertySetters(entityType); PropertySetter setter = null; if (!string.IsNullOrEmpty(fieldName) && setters.TryGetValue(fieldName, out setter)) { setter(entity, this.CurrentUserId); return true; } return false; }
protected internal virtual void Insert(object entity, EntityMetadata entityMetadata) { if (entity == null) throw new ArgumentNullException("entity"); object previousValue = null; if (IsAutomaticAuditDateFieldsEnabled) { SetAuditDate(this.SpecialFieldNames.CreatedDateFieldName, entity, entityMetadata, out previousValue); SetAuditDate(this.SpecialFieldNames.ModifiedDateFieldName, entity, entityMetadata, out previousValue); } if (IsAutomaticAuditUserFieldsEnabled) { SetAuditUser(this.SpecialFieldNames.CreatedByFieldName, entity, entityMetadata, out previousValue); SetAuditUser(this.SpecialFieldNames.ModifiedByFieldName, entity, entityMetadata, out previousValue); } DbCommand cmd = null; var cmdExecutor = new CommandExecutor(this, false) { GetCommandFunc = () => cmd = this.commandBuilder.GetInsertCommand(entity, entityMetadata) }; object autogeneratedFieldValue = null; string autogeneratedFieldName = entityMetadata.SequenceFieldName; if (entityMetadata.AutoIncrementFieldName != null) autogeneratedFieldName = entityMetadata.AutoIncrementFieldName; if (autogeneratedFieldName == null) { cmdExecutor.ExecuteNonQuery(); if (entityMetadata.IsPrimaryKeyGuid) { Guid primaryKeyValue = (Guid)entity.GetPropertyValue(entityMetadata.PrimaryKeyPropertyName); if (primaryKeyValue == Guid.Empty) { entity.SetPropertyValue(entityMetadata.PrimaryKeyPropertyName, cmd.Parameters[EntityLiteProvider.ParameterPrefix + entityMetadata.PrimaryKeyPropertyName].Value); } } return; } if (EntityLiteProvider.AutoGeneratedFieldFetchMode == AutoGeneratedFieldFetchMode.OutputParameter) { cmdExecutor.SetOutPutParametersAction = (dbcmd) => { var autogeneratedFieldParam = dbcmd.Parameters.Cast<IDataParameter>().FirstOrDefault(x => x.Direction == ParameterDirection.Output); if (autogeneratedFieldParam == null) { throw new InvalidOperationException(string.Format("There is no output parameter in insert command for autogenerated field {0}.{1},", entityMetadata.EntityType.Name, autogeneratedFieldName)); } autogeneratedFieldValue = autogeneratedFieldParam.Value; }; cmdExecutor.ExecuteNonQuery(); } else { autogeneratedFieldValue = cmdExecutor.ExecuteScalar(); } Type autogeneratedFieldType = autogeneratedFieldValue.GetType(); if (autogeneratedFieldType == entityMetadata.PrimaryKeyType) { entityMetadata.Setters[autogeneratedFieldName](entity, autogeneratedFieldValue); } else { entityMetadata.Setters[autogeneratedFieldName](entity, Convert.ChangeType(autogeneratedFieldValue, entityMetadata.PrimaryKeyType)); } }
private bool SetAuditDate(string fieldName, object entity, EntityMetadata metadata, out object previousValue) { if (entity == null) throw new ArgumentNullException("entity"); PropertyGetter getter; if (metadata.Getters.TryGetValue(fieldName, out getter)) { previousValue = getter(entity); } else { previousValue = null; } PropertySetter setter = null; if (!string.IsNullOrEmpty(fieldName) && metadata.Setters.TryGetValue(fieldName, out setter)) { Type type = metadata.Properties[fieldName].PropertyInfo.PropertyType; if (type == typeof(DateTime) || type == typeof(DateTime?)) { if (this.AuditDateTimeKind == DateTimeKind.Utc) { setter(entity, DateTime.UtcNow); } else { setter(entity, DateTime.Now); } } else if (type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?)) { if (this.AuditDateTimeKind == DateTimeKind.Utc) { setter(entity, DateTimeOffset.UtcNow); } else { setter(entity, DateTimeOffset.Now); } } else if (type == typeof(string)) { setter(entity, DateTimeOffset.Now.ToString("O")); } else { throw new NotSupportedException("The field \"" + fieldName + "\" is of an unsuported type " + type.Name); } return true; } return false; }
private static EntityMetadata CreateEntityMetadata(Type entityType) { object[] attributes = entityType.GetCustomAttributes(typeof(SqlEntityAttribute), false); if (attributes.Length == 0) return null; EntityMetadata entityMetadata = new EntityMetadata() { EntityType = entityType, Getters = PropertyHelper.GetPropertyGetters(entityType), Setters = PropertyHelper.GetPropertySetters(entityType) }; SqlEntityAttribute sqlMetadata = (SqlEntityAttribute)attributes[0]; entityMetadata.BaseTableName = sqlMetadata.BaseTableName; entityMetadata.SchemaName = sqlMetadata.SchemaName; PropertyInfo[] properties = entityType.GetProperties(); foreach (PropertyInfo pi in properties) { PropertyMetadata propertyMetadata = new PropertyMetadata(); propertyMetadata.PropertyInfo = pi; entityMetadata.Properties.Add(pi.Name, propertyMetadata); attributes = pi.GetCustomAttributes(typeof(SqlFieldAttribute), false); if (attributes.Length > 0) { SqlFieldAttribute field = (SqlFieldAttribute)attributes[0]; propertyMetadata.SqlField = field; if (field.IsKey && !string.IsNullOrEmpty(field.BaseTableName) && field.BaseTableName.Equals(entityMetadata.BaseTableName, StringComparison.InvariantCultureIgnoreCase)) { // propiedad con la misma columna base string conflictingPrimaryKeyPropertyName = entityMetadata.PrimaryKeyPropertyNames .FirstOrDefault(pn => entityMetadata.Properties[pn].SqlField.BaseColumnName == field.BaseColumnName); if (conflictingPrimaryKeyPropertyName == null) { entityMetadata.PrimaryKeyPropertyNames.Add(pi.Name); } else if (string.Equals(field.BaseColumnName, field.ColumnName, StringComparison.InvariantCultureIgnoreCase)) { entityMetadata.PrimaryKeyPropertyNames.Remove(conflictingPrimaryKeyPropertyName); entityMetadata.PrimaryKeyPropertyNames.Add(pi.Name); } } if (field.IsAutoincrement == false && field.IsReadOnly == false && string.IsNullOrEmpty(entityMetadata.BaseTableName) == false && string.Equals(entityMetadata.BaseTableName, field.BaseTableName, StringComparison.InvariantCultureIgnoreCase)) { string conflictingPropertyName = entityMetadata.UpdatableProperties .FirstOrDefault(kv => kv.Value.SqlField != null && kv.Value.SqlField.BaseColumnName == field.BaseColumnName).Key; if (conflictingPropertyName == null) { entityMetadata.UpdatableProperties.Add(pi.Name, propertyMetadata); } else if (string.Equals(field.BaseColumnName, field.ColumnName, StringComparison.InvariantCultureIgnoreCase)) { entityMetadata.UpdatableProperties.Remove(conflictingPropertyName); entityMetadata.UpdatableProperties.Add(pi.Name, propertyMetadata); } } if (field.IsAutoincrement && !string.IsNullOrEmpty(field.BaseTableName) && field.BaseTableName.Equals(entityMetadata.BaseTableName, StringComparison.InvariantCultureIgnoreCase)) { if (string.IsNullOrEmpty(entityMetadata.AutoIncrementFieldName) || string.Equals(field.BaseColumnName, field.ColumnName, StringComparison.InvariantCultureIgnoreCase)) { entityMetadata.AutoIncrementFieldName = pi.Name; } } if (!string.IsNullOrEmpty(field.SequenceName) && field.BaseTableName.Equals(entityMetadata.BaseTableName, StringComparison.InvariantCultureIgnoreCase)) { if (string.IsNullOrEmpty(entityMetadata.SequenceName) || string.Equals(field.BaseTableName, field.ColumnName, StringComparison.InvariantCultureIgnoreCase)) { entityMetadata.SequenceFieldName = pi.Name; entityMetadata.SequenceName = field.SequenceName; } } } if (pi.GetCustomAttributes(typeof(LocalizedFieldAttribute), false).Length > 0) { propertyMetadata.IsLocalizedFiled = true; } } if (entityMetadata.PrimaryKeyPropertyNames.Count == 1) { entityMetadata.PrimaryKeyPropertyName = entityMetadata.PrimaryKeyPropertyNames.FirstOrDefault(); } if (entityMetadata.PrimaryKeyPropertyName != null) { entityMetadata.PrimaryKeyType = entityMetadata.Properties[entityMetadata.PrimaryKeyPropertyName].PropertyInfo.PropertyType; entityMetadata.IsPrimaryKeyGuid = entityMetadata.PrimaryKeyType == typeof(Guid); } return entityMetadata; }