private void insert(Serializable objeto, String primaryKeyPropertyName, String tableName, bool cascade) { String insertQuery = "insert into " + tableName + "("; String valuesString = " values ("; List <SqlParameter> parametros = new List <SqlParameter>(); Dictionary <string, object> propertyValues = getPropertyValues(objeto); foreach (KeyValuePair <string, object> keyValuePair in propertyValues) { if (keyValuePair.Key != primaryKeyPropertyName || objeto.getPrimaryKeyType() == PrimaryKeyType.NATURAL) { String dataName = objeto.getMapFromKey(keyValuePair.Key); if (dataName != "") { insertQuery += dataName + ","; valuesString += "@" + dataName + ","; bool isSerializableProperty = typeof(Serializable).IsAssignableFrom(keyValuePair.Value.GetType()); Serializable serializableProperty = isSerializableProperty ? (Serializable)keyValuePair.Value : null; if (cascade && isSerializableProperty) { insert(serializableProperty, serializableProperty.getIdPropertyName(), serializableProperty.getTableName(), true); } object parametro = isSerializableProperty ? serializableProperty.getPropertyValue( serializableProperty.getIdPropertyName()) : keyValuePair.Value; DataBase.Instance.agregarParametro(parametros, "@" + dataName, parametro); } } } string primaryKeyName = objeto.getMapFromKey(objeto.getIdPropertyName()); insertQuery = insertQuery.Remove(insertQuery.Length - 1); valuesString = valuesString.Remove(valuesString.Length - 1); insertQuery += ") " + "output inserted." + primaryKeyName + valuesString + ")"; object insertResult = DataBase.Instance.ejecutarConsulta( insertQuery, parametros)[0][primaryKeyName]; Type idType = objeto.getPropertyType(objeto.getIdPropertyName()); object idValue = null; if (typeof(Serializable).IsAssignableFrom(idType)) { idValue = objeto.getIdValue(); Serializable serializableId = (Serializable)idValue; serializableId.GetType().GetProperty(serializableId.getIdPropertyName()). SetValue(serializableId, getCastedValue(insertResult, serializableId. getPropertyType(serializableId.getIdPropertyName()))); } else { idValue = getCastedValue(insertResult, idType); } objeto.GetType().GetProperty(objeto.getIdPropertyName()).SetValue(objeto, idValue); foreach (var item in objeto.getOneToManyPropertyNames()) { insertOneToManyProperty(objeto, item, cascade); } }