Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
        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));
            }
        }
Ejemplo n.º 3
0
 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;
 }
Ejemplo n.º 4
0
        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;
        }